ZJU 1272 Numerically Speaking

大数问题......

根据先余为低位,后余为高位的基本思想,进行26->10进制的互相转换。

注意如果输入为的10进制数为26的整数时,要先减一再求余,最后结果在加a..因为目标进制没有表示0的数

Presentation Error 了好几次。。要看到这句话“and the corresponding word number starting in column 23”

 

#include <stdio.h>
#include <string.h>

char str[50];
char num[50];

void strtonum(void)				//字母转数字
{
	int tem[50];
	int last;
	int i,j;
	bool sign=true;
	int remainder=0;
	int len=strlen(str);
	for (i=0;i<len;i++)
		tem[i]=str[i]-'a'+1;
	j=0;
	while(sign)			//当tem不全为零
	{
		remainder=0;
		for (i=0;i<len;i++)
		{
			last=tem[i];
			tem[i]=(remainder*26 +last)/10;			//储存商,做为下一轮的被除数
			remainder=(remainder*26+last)%10;
		}
		if((j+1)%4==0)
			num[j++]=',';
		num[j++]=remainder+'0';				//先余为低位,倒序储存
		sign=false;
		for (i=0;i<len;i++)
			if(tem[i]!=0)
			{
				sign=true;
				break;
			}
	}
	num[j]='\0';			//设置结束标志

}

void numtostr(void)				//数字转字母
{
	int tem[50];
	int len=strlen(num);
	int i,j;
	int c;
	bool sign=true;
	int remainder=0;
	for (i=0;i<len;i++)
		tem[i]=num[i]-'0';
	j=0;
	while(sign)		//当tem不全为零时
	{

		remainder=0;
		for (i=0;i<len;i++)
		{
			c=tem[i];
		
			if(i==len-1)
			{
				tem[i]=(remainder*10+c-1)/26;					//减一是为了防止当输入的数为26的整数倍时,发生错误
				remainder= (remainder*10+c-1)%26;
			}
			else
			{
				tem[i]=(remainder*10+c)/26;
				remainder= (remainder*10+c)%26;
			}

		}
		str[j++]=remainder+'a';

		sign=false;
		for (i=0;i<len;i++)
			if(tem[i]!=0)
			{
				sign=true;
				break;
			}

	}
	str[j]='\0';
}



int main()
{
	char tem[50];
	int i,j;
	while(scanf("%s",tem)&&tem[0]!='*')
	{
		
		if(tem[0]>='0'&&tem[0]<='9')
		{
			strcpy(num,tem);
			numtostr();
			for(i=strlen(str)-1;i>=0;i--)
				printf("%c",str[i]);
			for(i=23-strlen(str)-1;i>0;i--)			//从第23列输出数字
				printf(" ");
			for (i=0;i<strlen(num);i++)
			{
				if(i==strlen(num)%3&&i!=0)
					printf(",");
				else if(i%3-strlen(num)%3==0&&i!=0)
					printf(",");
				printf("%c",num[i]);

				
			}
			

		}
		else
		{
			strcpy(str,tem);
			strtonum();
			printf("%s",str);
			for(i=23-strlen(str)-1;i>0;i--)
				printf(" ");
			for(i=strlen(num)-1;i>=0;i--)
				printf("%c",num[i]);
			
			
		}
		printf("\n");

	}
	return 0;
}


 

你可能感兴趣的:(call)