c++数的读法

问题描述Tom教授正在给研究生讲授一门关于基因的课程,有一件事情让他颇为头疼:一条染色体上有成千上万个碱基对,它们从0开始编号,到几百万,几千万,甚至上亿。比如说,在对学生讲解第1234567009号位置上的碱基时,光看着数字是很难准确的念出来的。所以,他迫切地需要一个系统,然后当他输入12 3456 7009时,会给出相应的念法:十二亿三千四百五十六万七千零九 用汉语拼音表示为 shi er yi san qian si bai wu shi liu wan qi qian ling jiu 这样他只需要照着念就可以了。 你的任务是帮他设计这样一个系统:给定一个阿拉伯数字串,你帮他按照中文读写的规范转为汉语拼音字串,相邻的两个音节用一个空格符格开。 注意必须严格按照规范,比如说“10010”读作“yi wan ling yi shi”而不是“yi wan ling shi”,“100000”读作“shi wan”而不是“yi shi wan”,“2000”读作“er qian”而不是“liang qian”。 输入格式有一个数字串,数值大小不超过2,000,000,000。 输出格式是一个由小写英文字母,逗号和空格组成的字符串,表示该数的英文读法。 样例输入1234567009 样例输出shi er yi san qian si bai wu shi liu wan qi qian ling jiu 没思路啊,求大神指点,求代码求思路

//int64长整数改大写数字 coding by bhtzu
#include<stdio.h>
#include<math.h>
#include<string.h>
#if (!defined (_MAC) && (!defined(MIDL_PASS) || defined(__midl)) && (!defined(_M_IX86) || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64)))
#define LSCANF(X) scanf("%I64d",&X)
typedef __int64 LINT;
#else
#if defined(_MAC) && defined(_MAC_INT_64)
#define LSCANF(X) scanf("%I64d",&X)
typedef __int64 LINT;
#else
#define LSCANF(X) scanf("%d",&X)
typedef long LINT;
#endif //_MAC and int64
#endif //no _ULONGLONG_

int main()
{
    char* sNum[]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
    char* sBit[]={"","拾","佰","仟"};
    char* sTep[]={"","万","亿","万","亿","万","亿"};
    char* blank=" ";
    char input[100];
    char output[500];
    LINT m,n,i,j,isZero=0;
    LSCANF(m);
    while(m>0)//输入负数结束
    {
        memset(output,0,500);
        j=m;
        n = (LINT)log10((double)j)+1;
        for(i=0;i<n;i++,j=j/10)
            input[i] = (char)(j%10);
        for(i=n-1;i>=0;i--)
        {
            j=input[i];
            if(j==0)
                isZero=1;
            else if(j>0&&isZero==1)//N 个零完事了
            {
                strcat(output,sNum[0]);
                isZero=0;
            }
            if (j>0)
            {
                strcat(output,sNum[j]);
                strcat(output,sBit[(i)%4]);
            }
            if(i%4==0)
            {
                strcat(output,sTep[i/4]);
                isZero=0;
            }
        }
        if(strlen(output)==0)
            strcat(output,sNum[0]);
        printf("%s\n",output);
        LSCANF(m);
    }
    
    return 0;  
}

这是我之前做的关于大写数字读法的例子,格式要求稍有差别,思路是一致的,自己修改一下吧。

追问

好的我一会儿试试

追答

你这个比较特殊的就是十万那个,这个属于特例,要判断%4=1(十位)&&j==1(就是10)

追问

嗯,就是这块儿情况太多了不会整了

追答

%4=1&&j==1

这样的判断就是包含了十万十亿和一十,没用其它特殊情况了,最多再加上第一位j==n-1

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-11-06
这种题目没有算法可谈的,自己花点时间慢慢把所有情况都考虑到位就行了
把每种情况考虑到位 2000000000最多写一百多行 耐心点~追问

新手没头绪啊,您能否给个代码让我参考下?

追答

这个很繁琐- -打出来比较麻烦

C++怎么读取非常大的数(大约10的1000000次方)
可以有两种方式:1)以字符串形式全部读入,再转换为数值的数组 2)以字符的形式读入,转为数值后存入数组:char c;int i,a[1000005];scanf("%c",&c);for(i=0;c>='0' && c<='9'){a[i++]=c-'0';scanf("%c",&c);} \/\/为计算方便,通常需要将此数组逆置,即低位在前存放 ...

c++数的读法
defined(MIDL_PASS) || defined(__midl)) && (!defined(_M_IX86) || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64)))#define LSCANF(X) scanf("%I64d",&X)typedef __int64 LINT;#else#if defined(_MAC) && defined(_MAC_INT_64)#define LSCANF(X) scanf("%I64d"...

在C++的文件读写中,怎么直接从“下一行”开始读取数据?
由于C++处理文件是以流方式处理,要从下一行开始读取,先要能够将文件内部指针移到下一行,可以通过getline处理。istream inf("text.txt", ios::in);char buf[1000]; \/\/ 申请足够放入一行数据的大小 inf.getline(buf, 1000);这时文件内部指针就移到下一行的开始了。

C++ 读取文本 每行数据个数不同 怎么读取?
cout<<"该行共有"<<i<<"个数"<<endl; }}

C++中怎么逐行读取数据
可以使用C++的库函数getline实现。getline会生成一个包含一串从输入流读入的字符的字符串,直到以下情况发生会导致生成的此字符串结束。1)读到文件结束符;2)遇到函数指定的结束符;3)输入达到最大限度。getline有两种重载:istream &getline( char *buffer, streamsize num );istream &getline( char ...

C++怎么读取文件中的几个数字在将它们储存给相应的变量
比如在exe的当前文件夹的txt文档读取内容。include<iostream> #include<fstream> using namespace std; int main() { ifstream fin("in.txt"); int a; fin>>a; cout<<a<<endl; return 0; }

%编程里怎么读
C\/C++语言:运算中:模。函数(如:printf)中:“...型参数”。VB:Integer。在字符串中读作:百分号或百分之。例如: "%" 读作 "百分号""50%" 读作 "百分之五十"。其实也没有什么具体的读法,依照个人喜好。不过“百分号”是最通用的。

C++ 怎么读取 一排数字中间有分号这种情况
在c语言中,分号“;”是语句结束的标志,就相当于中文中的句号。表示一条语句的结束。反过来,“;"是语句的象征,本身 ";"就表示一条语句,称为空语句,一般用于占位。比如 while (1) ; ;第1个分号表示的是空语句,第2个分号表示的是语句结束符。主要区分表达式和语句的区别,在C语言中带分号...

c++字符串里存储的是数字,怎么让他从大到小排序
参考 这种方法: sscanf(s[i],"%[a-z]%d",junk,&a[i]); 可以略去开始的字母串,并读出 下面的 整数。3个 ID 的 读法 例子:include<stdio.h> main(){ char s[3][20]={"deco12","deco13","deco8"};char junk[3][20];int a[3];int i;for(i=0;i<3;i++){ sscanf(...

C++一道编程题(金额的读法),求全部代码
\/* Create by ABacker on 12\/04\/2017 [0,100000)金额读法*\/#include <stdio.h>int main() { const char *s[] = { "wan","qian","bai","shi","" }; const int div[] = { 10000,1000,100,10,1 }; int n; scanf("%d", &n); if (n =...

相似回答