题记:刚开始思考的时候一直认为 c中类型可以涵盖这个结果,但是我发现我错了,当我使用了循环之后就出现了随机值,最后又想到了堆栈文件等一系列的存储方式,但是由于水平有限无法成功。
后来就想到了用数组存储值得位数的办法,最终得到了解决。
#include<stdio.h>
#include <string.h>#define NUM 105 //数组的大小
#define POW 100 //11的次幂数
void print(int a[],int n) //辅助输出函数
{
int i ;
for(i = 0 ;i < n ; i++)
{
if(i % 5 == 0)
{
printf("\n");
}
printf("%d ",a[i]);
}
printf("\n");
}
void carry( int a[],int n) //进位处理函数
{
for(int i = 0 ; i < n ; i++)
{
if( a[i] > 9)
{
a[i+1] += 1 ;
a[i] -= 10 ;
}
}
}
void init(int a[],int n ) //对数组进行初始化
{
int i = 0 ;
for( i = 0 ;i < n ; i++ )
a[i] = 0 ;
}
int count(int a[]) //计算当前数组后面有多少个0
{
int i,j = 0;
for(i = NUM-1 ; a[i]==0 ; i--)
j++ ;
return j ;
}
int main()
{
int i,j,num,countOne, test=0,temp[NUM],array[NUM];
init(array,NUM) ; //对数组进行初始化
init(temp,NUM) ;
array[0]=1; // 11的0次幂。
for(i = 1 ; i <= POW ; i++)
{
num = NUM - count(array); //计算数组中的值位数。
memcpy(temp,array,num*sizeof(int)); //数组的复制。
for(j = num ; j >=1 ; j--)
{
array[j] = array[j-1] ; //移位操作 *10
}
array[0] = 0 ; //末尾进行初始化 0
for(j = 0 ; j < num ; j++)
{
array[j] += temp[j] ;
}
carry(array,NUM);
}
print(array,NUM) ;
for(i = 0,countOne=0 ; i < NUM ; i++)
{
if(array[i] == 1)
countOne++ ;
}
printf("11的100次幂包含了%d个'1'.\n",countOne);
return 0 ;
}