主要考虑大数问题。n一大很容易超过正数能表示的范围,因此需要用字符数组模拟。
先增加1,再打印。如下
- <span?style="font-size:?18px;">#include?<stdio.h>??
- #include?<stdlib.h>??
- ??
- ??
- int?add(char*?number)??
- {??
- ????int?overflow?=?0,i,current_value;??
- ????int?nLength?=?strlen(number),jinwei?=?0;??
- ???
- ????for(i?=?nLength?-?1;?i?>=?0;?i?--){??
- ????????current_value?=?number[i]?-?'0'?+?jinwei;????
- ????????if(i?==?nLength?-?1)????
- ????????????current_value?++;??
- ???
- ????????if(current_value?>=?10){????
- ????????????if(i?==?0)??
- ????????????????overflow?=?1;????
- ????????????else{??
- ????????????????current_value?-=?10;????
- ????????????????jinwei?=?1;??
- ????????????????number[i]?=?'0'?+?current_value;??
- ????????????}??
- ????????}??
- ????????else{????
- ????????????number[i]?=?'0'?+?current_value;??
- ????????????break;??
- ????????}??
- ????}??
- ???
- ????return?overflow;??
- }??
- ??
- ??
- ??
- void?print_a_number(char*?number)??
- {??
- ????int?begin?=?0,i;??
- ???
- ????for(i?=?0;?i?<?strlen(number);?++?i){??
- ????????if(!begin?&&?number[i]?!=?'0')??
- ????????????begin?=?1;??
- ???
- ????????if(begin)??
- ????????????printf("%c",?number[i]);??
- ????}??
- ???
- ????printf("t");??
- }??
- ??
- void?print_all(int?n)??
- {???
- ????charchar?*number?=?(char*)malloc((n+1)?*?sizeof(char));????
- ????if(n?<=?0)???return;??
- ????memset(number,?'0',?n);??
- ????number[n]?=?' ';??
- ???
- ????while(!add(number)){??
- ????????print_a_number(number);??
- ????}??
- ???
- ????free(number);??
- }??
- ??
- ??
- void?main()??
- {??
- ????print_all(2);??
- ????getch();??
- }</span>??
<span style="font-size: 18px;">#include <stdio.h>
#include <stdlib.h>
//溢出返回1,否则0
int add(char* number)
{
int overflow = 0,current_value;
int nLength = strlen(number),jinwei = 0;
for(i = nLength - 1; i >= 0; i --){
current_value = number[i] - '0' + jinwei; //每一位加上进位
if(i == nLength - 1) //最低位还要加上1
current_value ++;
if(current_value >= 10){ //其实是在等于10的时候,需要进位
if(i == 0)
overflow = 1; //最高位需要进位时说明已经到了最大值
else{
current_value -= 10; //不是最高位就要进位操作,首先将当前位减去10,然后设置进位标志待下一次使用
jinwei = 1;
number[i] = '0' + current_value;
}
}
else{ //不需要进位就把current_value赋值给number位就行
number[i] = '0' + current_value;
break;
}
}
return overflow;
}
//打印出这个数字,并忽略开头的0
void print_a_number(char* number)
{
int begin = 0,i;
for(i = 0; i < strlen(number); ++ i){
if(!begin && number[i] != '0')
begin = 1;
if(begin)
printf("%c",number[i]);
}
printf("t");
}
void print_all(int n)
{
char *number = (char*)malloc((n+1) * sizeof(char)); //最后一位要放
if(n <= 0) return;
memset(number,'0',n);
number[n] = ' ';
while(!add(number)){
print_a_number(number);
}
free(number);
}
void main()
{
print_all(2);
getch();
}</span>
参考剑指offer
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|