zoukankan      html  css  js  c++  java
  • 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]='';			//设置结束标志
    
    }
    
    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]='';
    }
    
    
    
    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("
    ");
    
    	}
    	return 0;
    }


     

  • 相关阅读:
    读后感悟
    使用java的循环单向链表解决约瑟夫问题
    稀疏数组
    java实现队列
    ASP.NET学习4. ASP.NET Ajax下POST完成后调用javascript函数
    ASP.NET学习3.前端和后台的相互调用
    ASP.NET学习1.使用“<% %>”嵌入代码
    ASP.NET学习2.弹出对话框的方法
    HTML5程序怎么打包成windows phne, ios和android的应用[转]
    PHP多文件上传个人理解总结 [转]
  • 原文地址:https://www.cnblogs.com/frankM/p/4399541.html
Copyright © 2011-2022 走看看