第一步。n位的整数,各位之和最小是1,最大是9n。
100位的整数,各位之和最大才是900。
前缀从1遍历到900。
第二步。假设100位的整数各位之和是199,199-1-9-9=180,也就是说后97位之和是180。
后97位中有a个9,b个8,c个7,……,通过循环算出每个组合。
第三步。a个9,b个8,c个7,…… 一共可以组成 97! / a! / b! / c! / ...... 种不同的97位数。
看起来最后一步有问题,数值太大,我得再想想
#include <stdio.h> #include <stdlib.h> #include <string.h> void print_value(int count,int current_len,const char *a) { char c_str[]={1,0,0,0,0,0,0,0,0,7},c_len,ch; char b[110]; int i,j,offset=0; c_len=sizeof(c_str); memset(b,0,sizeof(b)); printf("%d ",count); for(i=current_len-1,j=0;i>=0;i--) { printf("%d",a[i]); b[j++]=a[i]; } while(1) { if(offset>current_len-c_len) break; if(memcmp(b+offset,c_str,c_len)>=0) { for(i=c_len-1+offset,ch=0;i>=0+offset;i--) { ch=ch+b[i]-c_str[i-offset]; if(ch>=0) { b[i]=ch; ch=0; } else { b[i]=ch+10; ch=-1; } } for(i=0;i<current_len;i++) { if(b[i]!=0) { offset=i; break; } } } else { break; } } printf(" "); for(i=offset;i<current_len;i++) { printf("%d",b[i]); } printf("\n"); } int main() { char a[100],b[5]; int i,j,n,sum,count=0,current_bit=0,current_len; printf("请输入一个正整数(长度大于0,小等于100):"); scanf("%u",&n); memset(a,0,sizeof(a)); current_len=1; while(1) { for(i=0;i<=9;i++) { a[current_bit]=i; for(j=0,sum=0;j<current_len;j++) sum+=a[j]; memset(b,0,sizeof(b)); sprintf(b,"%d",sum); for(j=0;j<strlen(b);j++) { if(b[j]!=a[current_len-j-1]+'0') break; } if(j==strlen(b) && a[current_len-1]!=0) { count++; print_value(count,current_len,a); } } while(1) { if(a[current_bit]<9) { a[current_bit]++; current_bit=0; break; } else { current_bit++; if(current_bit>=current_len) { current_len++; current_bit=0; memset(a,0,sizeof(a)); break; } } } if(current_len>n) break; } return 0; }
[此贴子已经被作者于2022-3-25 11:01编辑过]
#include <stdio.h> #include <stdlib.h> #include <string.h> void print_value(int count,int current_len,const char *a) { char c_str[]={1,0,0,0,0,0,0,0,0,7},c_len,ch; char b[110]; int i,j,offset=0; c_len=sizeof(c_str); memset(b,0,sizeof(b)); printf("%d ",count); for(i=current_len-1,j=0;i>=0;i--) { printf("%d",a[i]); b[j++]=a[i]; } while(1) { if(offset>current_len-c_len) break; if(memcmp(b+offset,c_str,c_len)>=0) { for(i=c_len-1+offset,ch=0;i>=0+offset;i--) { ch=ch+b[i]-c_str[i-offset]; if(ch>=0) { b[i]=ch; ch=0; } else { b[i]=ch+10; ch=-1; } } for(i=0;i<current_len;i++) { if(b[i]!=0) { offset=i; break; } } } else { break; } } printf(" "); for(i=offset;i<current_len;i++) { printf("%d",b[i]); } printf("\n"); } int main() { char a[100],b[5]; int i,j,k,n,sum,count=0,current_bit=0,current_len,count_temp=0; printf("请输入一个正整数(长度大于0,小等于100):"); scanf("%u",&n); memset(a,0,sizeof(a)); current_len=1; while(1) { for(i=0;i<=9;i++) { a[current_bit]=i; for(j=0,sum=0;j<current_len;j++) sum+=a[j]; memset(b,0,sizeof(b)); sprintf(b,"%d",sum); for(j=0;j<strlen(b);j++) { if(b[j]!=a[current_len-j-1]+'0') break; } if(j==strlen(b) && a[current_len-1]!=0) { count++; print_value(count,current_len,a); } } while(1) { if(a[current_bit]<9) { a[current_bit]++; for(i=0;i<current_bit;i++) a[i]=0; current_bit=0; break; } else { current_bit++; if(current_bit>=current_len) { current_len++; current_bit=0; memset(a,0,sizeof(a)); a[current_len-1]=1; break; } } } if(current_len>n) break; } return 0; }
[此贴子已经被作者于2022-3-27 17:57编辑过]