【C语言】打印1到n位数。

来看一个问题:

打印1到n位数:(例如打印1到3位数,即输出1到999)

第一眼看到这个题的时候感觉好简单。一个for循环不断输出就能够解决问题。但是大家仔细想一下。在语言中数据类型存在最大的上限值。最大的数据结构unsinged long long.

它的最大值为:18446 74407 37095 51615.也就是20位。当我们想要输出1到21位数就会超出类型的最大值(早早就超出了)。

所以我们该怎么设计这个程序呢?

这里提供的思路一共有3种。

1.运用数组。数组中的一个数组代表一个位。运用十进一的制度进行位的判断。从数组的最后元素进行输出。最后一位等于个位。倒数第二位等于十位。当我们只输出3位数时。我们选择多取一个数组元素进行下标的上限判断。当这个值为一。我们就跳出输出的循环。

2.运用字符串。这个在C++中运用字符串的操作。若是在C中的话运用字符串还是运用数组。所以暂时不予讨论。

3.运用递归。递归进行位数判断输出。限制输出的数量。3个递归的循环完成递归(应该是=。=)。

下面给出数据输出的源代码:

#include <stdio.h>
#include <math.h>

//设定数组的长度,确定输出位数的最大值。50时。最大值为49.因为有一个用来判断位。
#define MAX_BIT 50

void printf_n(char num[],int m)
{
	int i = 0;
	num[MAX_BIT-m] = 1;
        //无限循环输出数组元素,当判断位为1.则跳出循环。
	while(1)
	{    
	        //利用十进一的制度。对数组所有值进行判断。
		if(num[MAX_BIT-1] == 10)
		{
			i = 1;
			do
			{
				num[MAX_BIT-i] = 0;
				num[MAX_BIT-i-1]++;
				i++;
			}while(i < MAX_BIT && num[MAX_BIT-i] == 10);
		}

		//判断位循环跳出。
		if(num[MAX_BIT-m-1] == 1)
		{
			break;
		}
		//输出当前数字。确定输出的位数值。
		for(i = MAX_BIT-m;i <= MAX_BIT-1;i++)
		{
			printf("%d",num[i]);
		}
		printf(" ");

		//个位加一。
		num[MAX_BIT-1]++;

	}

}

int main()
{
	int m = 0;
	int bit = 0;
	char num[MAX_BIT] = {0};
	printf("请输入需要打印的位数");
	scanf("%d",&bit);
	for(m = 1;m<=bit;m++)
	{
		printf_n(num,m);
	}
}

这就是利用数组打印数字的代码。在拿到一个问题是。要考虑他所有应该出现的情况。

1.数据的溢出。

2.数据输入输出的正确性。

3.数据中间可能出现的改变差错。

4.设置目的可能出现的错误情况。

game over。

时间: 2024-11-07 07:33:26

【C语言】打印1到n位数。的相关文章

C语言打印记事本内搜索字符串所在行信息

本程序采用C语言编写,使用方法: 1.双击“甲骨文字符串查询作品.exe”运行程序; 2.运行前请确保此可执行程序目录下有1.txt文件. 3.根据提示输入一个字符串,程序将显示存在所搜索字符串的所有行! 程序如果问题,请联系[email protected]! 2014-7-31日安阳师范学院机房完成. 程序截图: 源码如下: #include <stdio.h> #include<string.h> #include<stdlib.h> #include<co

&#8203;用c语言打印自定义的乘法口诀表。例如:输入9,输出9*9口诀表,输入12,输出12*12的乘法口诀表。

用c语言打印自定义的乘法口诀表.例如:输入9,输出9*9口诀表,输入12,输出12*12的乘法口诀表. #include <stdio.h> int main () { int n; int i, j; printf ("请输入要打印多大的乘法口诀表"); scanf ("%d",&n); for (j=1; j<=n; j++) { for(i=1; i<=j; i++) { printf ("%d*%d=%2d &quo

C语言打印100以内的质数

C语言打印100以内的质数 #include <stdio.h> int main() { int number; int divisor; for( number = 3; number <= 100; number += 2 ) { for( divisor = 3; divisor <= number; divisor += 2 ) { if( number % divisor == 0 ) break; } if( divisor == number ) printf(&q

递减打印最大的N位数到1 (2015年 JXNU_ACS 算法组暑假第一次周赛)

递减打印最大的N位数到1 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submission(s) : 21   Accepted Submission(s) : 4 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 给定一个数字N,M,递减打印最大的N位数到1的前M

C语言打印100到200之间的素数

用C语言打印素数,我们首先要了素数的相关定义:只有1和它本身两个因数的自然数,也就是说除了1和它本身外,不能被其他自然数整除的数就称为素数. 例如:101只能被1 和101 整除:103只能被1 和103 整除,所以他两都是素数 思路: 要判断一个数是否为素数可以验证从2开始到它本身的数里是否有可以被他取余数为0 的数字,如果有则证明它不是素数.反之则输出素数. 1 # include<stdio.h> 2 int main() 3 { 4 int i = 0; 5 int count = 0

C语言打印水平直方图或者垂直直方图

在C程序设计语言(第2版?新版)一书中有一道打印单词数目水平或者垂直直方图的习题,参见该第17页.现在假如我们已经得到了单词的计数数组. 打印水平方向的直方图比较简单, 只需要两重循环即可,外层循环执行的次数是数组长度.内层循环为该数组每个元素的大小.方法如下: 1 /* 2 * 打印水平方向直方图 3 * 4 */ 5 void horizontal(int array[],int len){ 6 7 printf("\t↑\n"); 8 printf("\t|\n&quo

C语言打印各种图形

C语言中用循环可以打印出各种图形 1 直角三角形(靠右直立):部分代码 int i,j; for (i=0; i<6; i++) { for (j=6;j>i ;j-- ) { printf(" "); } for (j=0; j<=i; j++) { printf("*"); } printf("\n"); } 运行效果: 还有各种直角三角形就不一一介绍了. 2.等腰三角形(直立)部分代码如下: int i,j; for (i

C语言打印杨辉三角(2种方法)

杨辉三角是我们从初中就知道的,现在,让我们用C语言将它在计算机上显示出来. 在初中,我们就知道,杨辉三角的两个腰边的数都是1,其它位置的数都是上顶上两个数之和.这就是我们用C语言写杨辉三角的关键之一.在高中的时候我们又知道,杨辉三角的任意一行都是的二项式系数,n为行数减1.也就是说任何一个数等于这个是高中的组合数.n代表行数减1,不代表列数减1.如:第五行的第三个数就为=6. 现在我们按第一种思路来写:先定义一个二维数组:a[N][N],略大于要打印的行数.再令两边的数为1,即当每行的第一个数和

C语言之linux内核实现位数高低位互换

linux内核实在是博大精深,有很多优秀的算法,我之前在工作中就遇到过位数高低位交换的问题,那时候对于C语言还不是很熟练,想了很久才写出来.最近在看内核的时候看到有内核的工程师实现了这样的算法,和我之前想的一样,那么今天就把它分享出来吧. 在开发需求中,有要实现32位.16位.8位数高低位交换的算法.那么我们具体看看代码实现: 还是一样,从linux内核中将代码抠出来: #include <stdio.h> //将一个8位数高低4位交换 static inline unsigned char