该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
昨天做这个题目真的火来了,做了几个小时就是对数字0的统计出错,其他1~9的统计完全这确,晚上又拿着它琢磨,数字0统计出错,放弃了,这么简单的问题竟然折磨死人,刚才改了程序,编译运行通过,计算结果完全正确!此题出自计算机算法设计与分析课后的习题,想拿来和大家讨论!此程序可以计算出0~2147483647(即(2^31)-1)的页码数!
#include
#include
int main()
{
void dev(int[],int);
long int n,i;
int a[10]={0};
printf("请输入书的页码数n(0
scanf("%d",&n);
for(i=1;i<=n;i++)
dev(a,i);
printf("\n");
for(i=0;i<10;i++)
printf("编码为%d的个数:\t\t%-d\n",i,a[i]);
getch();
}
void dev(int array[],int number)
{
int a,b,c,d,e,f,g,h;
a=number/10000000; /*分离第八位*/
b=number/1000000%10; /*分离第七位*/
c=number/100000%10; /*分离第六位*/
d=number/10000%10; /*分离第五位*/
e=number%10000/1000; /*分离第四位*/
f=number%1000/100; /*分离第三位*/
g=number%100/10; /*分离第二位*/
h=number%10; /*分离第一位*/
/*分离方法值得反思,这里就是节约内存的分离方法,所以定义a~h为整型数,而不是长整型数的原因*/
if(a!=0)
{array[a]++;array[b]++;array[c]++;array[d]++;array[e]++;array[f]++;array[g]++;array[h]++;}
else if(b!=0)
{array[b]++;array[c]++;array[d]++;array[e]++;array[f]++;array[g]++;array[h]++;}
else if(c!=0)
{array[c]++;array[d]++;array[e]++;array[f]++;array[g]++;array[h]++;}
else if(d!=0)
{array[d]++;array[e]++;array[f]++;array[g]++;array[h]++;}
else if(e!=0)
{array[e]++;array[f]++;array[g]++;array[h]++;}
else if(f!=0)
{array[f]++;array[g]++;array[h]++;}
else if(g!=0)
{array[g]++;array[h]++;}
else if(h!=0)
{array[h]++;} /*变量做下标,统计数字,匠心独运*/
}
算法如下图: