题目
大概意思:第一行给出一个不大于10^100数,将各个位上的数组相加的和 用英文输出相加的和各个位置的数字,如12345,1+2+3+4+5=15 输出 one five;
10^100肯定不能用int long long 定义一个字符数组保存 char num[101]即可;
输出的话,先用取余的方法将各个位数组存储到另一个数组中,然后逆序输出即可(因为取余是从低位取到高位);
第一次提交:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 6
/*用char字符串型,加*变成指针型,单引号变双引号*/
char *s[ ] = {"zero","one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}; //定义字符型数组;
int GetFigure(int *n) //记得*n 求sum的位数
{
int count = 0;
do
{ count++;
*n /= 10;
} while(*n != 0);
return count;
}
int main()
{
int a;
int sum=0;
int i;
for(i=0;i<N;i++)
{
scanf("%d",&a);
sum+=a;
}
printf("%d\n",sum);
int b=0;
int len=GetFigure(&sum);
// printf("长度为%d\n",len);
int j;
// b=sum%10;
// printf("%d",b);
// printf("%d",sum);
// printf("%s",s[0]);
int c=1;
for(j=0;j<len;j++){
b=(sum/c)%10; //把数字分解
// printf("%d",sum);
// printf("%d",b);
printf("%s",s[b]);
printf("\t");
c*=10;
}
return 0;
}
大体思路没毛病,但有非常多的问题,比如一上来我就用int型数组就错了,而且采用循环单独输入再求和,实在没必要,还要再把sum分开,还要求sum的位数;而且直接for循环中输出分解的数字对应的字母实在low。
得到数字的位数:
提取数字每一位数:
字符串数组的定义:
找了个和自己思路类似,借鉴再改一改
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
string print1[10] ={"zero","one","two","three","four","five","six","seven","eight","nine"};
int numPrint[101];
int main(){
char num[101];
scanf("%s",num);
int len = strlen(num);
int sum = 0;
for(int i=0 ;i<len ;i++){
sum += num[i]-'0';
}
if(sum==0){ //如果是0 直接输出zero 即可
printf("zero\n");
}else{
int n=0;
while(sum>10){
numPrint[n] = sum%10;
sum /= 10;
n++;
}
numPrint[n] = sum; //别忘了处理最后一位
for(int i=n ;i>=0 ;i--){
if(i==n){
cout<<print1[numPrint[i]];
}else{
cout<<" "<<print1[numPrint[i]];
}
}
printf("\n");
}
return 0;
}
第二次提交:
把后面的变量b改成b[n]数组,把分解的每位数储存在数组里,而不是直接转化输出。在用个for循环输出,学学这种思路,但还是不对,不对是必然的。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 6
/*用char字符串型,加*变成指针型,单引号变双引号*/
char *s[ ] = {"zero","one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}; //定义字符型数组;
int GetFigure(int *n) //记得*n
{
int count = 0;
do
{ count++;
*n /= 10;
} while(*n != 0);
return count;
}
int main()
{
int a;
int sum=0;
int i;
for(i=0;i<N;i++)
{
scanf("%d",&a);
sum+=a;
}
printf("%d\n",sum);
int b[101];
int len=GetFigure(&sum);
printf("长度为%d\n",len);
int j;
int c=1;
int n=0;
for(j=0;j<len;j++){
b[n]=(sum/c)%10; //把数字分解
c*=10;
n++;
}
// b[n] = sum; //别忘了处理最后一位
int t=0;
for(t=n ;t>=0 ;t--){
printf("%s\t",s[t]);
printf("\n");
}
return 0;
}
真的裂开,每次都是210
人家的正确的:
#include <cstdio>
#include <cstring>
const int maxn=110;
int main()
{
int m,n,k,no,t;
char str[maxn],s[maxn];
char ans[10][8]={"zero","one","two","three","four","five","six","seven","eight","nine"};//定义字符串数组
scanf("%s",str); //直接输入个长字符串数
int sum=0;
for(int i=0;str[i]!='\0';++i)
{
sum+=str[i]-'0'; //每位加和,从字符串类型到整型
}
sprintf(s,"%d",sum);//把整数sum打印成一个字符串保存在s中。
for(int i=0;s[i]!='\0';++i)
{
printf("%s",ans[s[i]-'0']);//从ans中找到对应的输出
if(s[i+1]!='\0')//从第二个字母数字开始插入空格
printf(" ");
else
printf("\n");
}
return 0;
}