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;
    }


     

  • 相关阅读:
    Attach Volume 操作(Part II)
    Attach Volume 操作(Part I)
    Create Volume 操作(Part III)
    Create Volume 操作(Part II)
    Linux 内核Coding Style整理
    内核工具 – Sparse 简介
    IP101A芯片默认物理地址(PHY Adress)确定
    嵌入式设备上的 Linux 系统开发
    嵌入式Linux开发系列之一: 走进嵌入式Linux的世界
    嵌入式 Linux 应用:概述
  • 原文地址:https://www.cnblogs.com/frankM/p/4399541.html
Copyright © 2011-2022 走看看