单词长度试题的剖释,程序设计入门

标题供给:

<img width="108" height="40" alt="浙江大学" src="http://imgsize.ph.126.net/?enlarge=true&imgurl=http://img1.ph.126.net/DRP1fc7IDe3Jux_yvA0OnQ==/3186859686418268890.jpg_108x40x1x95.png" />  

你的次序要读入黄金时代行文本,此中以空格分隔为多少个单词,以.停止。你要出口每一种单词的长短。这里的单词与语言毫不相关,能够包含各个符号,比如it’s算多少个单词,长度为4。注意,行中恐怕现身三回九转的空格;最终的.不总括在内。

该难点有二种解法,那么根据现成知识(if-else和while卡塔 尔(英语:State of Qatar)如何完结这几个标题?

1) 首先依据题目必要,总括单词的长短,以.结束,这时候大家应该能想到while(ch
!= ‘.’) 。再依照提醒,字符使用scanf(“%c”,&c);三个一个的读入。
2卡塔 尔(阿拉伯语:قطر‎然后标题必要测算每一个单词的长度,以空格分隔为多少单词,就算我们就总计难点给出的样例:It’s
great to see you here.。

  • 首先需求定义整型变量count,贮存单词的长度
  • 接下来读入字符后,须求对字符实行判断是不是为空格,要是字符不是空格,那么count++,如若是空格,则一个单词完成,打字与印刷出count的数,然后再对count清0,打算总结下三个单词的个数。若成功那么些基本效能,代码长如下的轨范:

int main (void)
{ 
    char c;
    int count=0;
    scanf("%c",&c);
    while(c != '.'){
        if(c==' '){
            printf("%d ",count);
            count=0;
            }
        else{
            count++;
        }   
        scanf("%c",&c);
    }
    return 0; 
}

图片 1

  • 将输入样例输入后,输出结果可以健康突显出前多少个单词的个数,可是最终一个单词的个数没有打字与印刷,分析程序,是因为最后贰个数字还未有打字与印刷时就退出循环,那么就供给在while甘休后拉长该最后三个单词长度的打字与印刷:

# include <stdio.h>
# include <math.h>
int main (void)
{ 
    char c;
    int count=0;
    scanf("%c",&c);
    while(c != '.'){
        if(c==' '){
            printf("%d ",count);
            count=0;
            }
        else{
            count++;
        }   
        scanf("%c",&c);
    }
    if(c=='.') printf("%d",count);
    return 0; 
}

运营输入样例,结果和PTA上的输出样比方出一辙了~

图片 2

当您非常欢愉的将代码提交到PTA上时,你会意识PTA上依然有错误:

图片 3

前后相继设计入门——C语言

PTA测尝试地点错误难点的减轻:

斟酌上海体育地方中pta的提醒新闻,程序还未有杜撰部分空格的事态,那么依照pta的提示一个二个的打下:
1卡塔尔首先是空句子的难点,比方只输入二个点是空句子,未有单词应该没有长度,便是没有别的输出(那一点俺也是问过出题的翁恺先生才感觉理当如此卡塔尔,而我们的次序会输出三个0,首先要领会0是哪条语句输出的,其实是终极一条if,那么大家就须求对最后一条再增加二个节制标准,有单词也便是说count
!=0的时候才打字与印刷出count的值。程序改进为:

int main (void)
{ 
    char c;
    int count=0;
    scanf("%c",&c);
    while(c != '.'){
        if(c==' '){
            printf("%d ",count);
            count=0;
            }
        else{
            count++;
        }   
        scanf("%c",&c);
    }
    if(count!=0 && c=='.') printf("%d",count);
    return 0; 
}

双重提交空句子的测试点过了,可是接连多少个空格和始发结尾多空格的错误依旧在,继续纠正代码支持那多个状态:

2卡塔尔国多少个空格的状态:运营上述顺序输入多个空格,结果如下,各样空格都会输出二个0,那显明不得以,那么怎么才具幸免八个空格时,第贰个空格输出值,有再一次的空格时就不再输出,依旧是第一解析打字与印刷0的语句是哪句?
图片 4

拆解拆解分析下程序/调试二次程序就知道while循环里的如果是空格则printf(“%d
“,count);,那么该printf语句就要求丰裕限制标准,假设有多少个空格时就毫无打字与印刷,但要是唯有1个空格时方可打字与印刷,那么程序该怎么修正那?有二种办法,这里给出一个相比简要介绍的主意,便是判定count是否为0,如若不为0则打字与印刷,不然不打字与印刷:

int main (void)
{ 
    char c;
    int count=0;
    scanf("%c",&c);
    while(c != '.'){
        if(c==' '){
            if(count !=0){
                printf("%d ",count);
            }
            count=0;
            }
        else{
            count++;
        }   
        scanf("%c",&c);
    }
    if(count!=0 && c=='.') printf("%d",count);
    return 0; 
}

重复提交到pta,两个空格的测验点过了。使用count是还是不是等于0来缓慢解决几个空格的难点,我们认真心得下,也招待给自家留言其余的主意。有的同学恐怕会说想不到那么些艺术,没涉及,练多了就能够体悟了。
3卡塔尔国在此之前结尾多空格 这么些测试点是格式错误,再审题,标题须求输出格式如下:

在豆蔻梢头行中输出那行文本对应的单词的长度,各类长度之间以空格隔离,行末没有最终的空格。

依据那些供给,须要对打字与印刷格式实行调节,行末不可能有空格,剖析上述顺序,当行尾有空格时,最终多个单词的长短是while循环里的printf打字与印刷的,是有空格的,那么对那么些printf再加限制准绳,要是是最终叁个数值的打字与印刷则不加空格,不然加上空格,怎么样得以达成,方法也正如多,这里运用加标识flag的艺术,,实际情况见上面代码,具体请自行深入分析:

int main (void)
{ 
    char c;
    int count=0;
    int flag=0;  //前面是否有单词标志
    scanf("%c",&c);
    while(c != '.'){
        if(c==' '){
            if(count !=0){
                if(flag==1)
                    printf(" %d",count);    //前面有单词,且行尾有空格的输出格式。
                else{
                    printf("%d",count);  //第一个单词,且不是只有一个单词时的输出格式
                    flag=1;
                }

            }
            count=0;
            }
        else{
            count++;
        }   
        scanf("%c",&c);
    }
    if(count!=0 && c=='.')    //行尾没有空格
        if(flag==0)
            printf("%d",count);  //只有一个单词时的输出格式,且行尾没有空格的输出格式
        else{
            printf(" %d",count);  //有多个单词,且行尾没有空格的输出格式
            flag=1;
        }

    return 0; 
}

稍许同学问笔者flag的含义,首先表扬那些校友对难点的执着,相当的赞,然后flag的意思作者曾在上头代码中增加了批注,自行查看,其实是本着不一致输入相应输出格式的挑肥拣瘦,所以在看上述代码时,应当要利用调节和测量试验单步实行的效率!
然后输入差异样例,例如下面说的唯有一个单词、多个单词、行尾有多少个空格,行头有多个空格,单词中间有八个空格等状态的排列组合,单步实践去深入分析和精晓差异输入时输出。那么为何要犹如此三种出口方式,题意必要~

翁恺

图片 5

分享到

接济大旨

检测与作业

次聚焦由CSDN-fjinhao原创,转发请注脚来源,此汇总由于本人

力量轻易,难免会些难题,款待各位程序爱好者来此研究调换,授予指正,自己

联系邮箱fjinhao@qq.com,谢谢。

翻开援助

教员还未颁发测量检验和作业,请意志力等待

第1周:计算

 

第1周编制程序演练

截至时间:贰零壹伍年七月4日 0:00

前去作业

作业项目

Online Judge作业

作业甘休时间

2015年5月4日 0:00

成就公布时间

2015年5月4日 0:00

1

逆序的三个人数(5分卡塔 尔(英语:State of Qatar)

主题素材内容:

逆序的三位数:

前后相继每一趟读入三个正叁位数,然后输出逆序的数字。注意,当输入的数字带有结尾的0时,输出不应带有前导的0。譬如输入700,输出应该是7。

提示:用%10得以收获个位数,用/100足以收获百位数…。将如此获得的多个数字合起来:百位*100+十位*10+个位,就拿走了结果。

输入格式:

各样测试是二个3位的正整数。

输出格式:

输出逆序的数。

输入样例:

123

出口样例:

321

光阴约束:500ms内部存储器节制:3二〇〇〇kb

代码参照他事他说加以调查:

#include<stdio.h>

int main()

{
int n;

scanf("%d",&n);

int t1=n%10;

int t2=(n-n/100*100)/10;

int t3=n/100;

int t=t1*100+t2*10+t3;

printf("%d",t);

return 0;

}

第2周:判断

 

第2周编制程序演练

终结时间:2014年10月4日 0:00

前往作业

作业项目

Online Judge作业

作业停止时间

2015年5月4日 0:00

培育发表时间

2015年5月4日 0:00

1

时刻换算(5分卡塔尔国

主题材料内容:

UTC是世界协调时,BJT是东京时间,UTC时间一定于BJT减去8。今后,你的主次要读入多个整数,表示BJT的时和分。整数的个位和十一位表示分,百位和千位表示小时。若是时辰小于10,则未有千位部分;若是时辰是0,则从未百位部分;假诺时辰不是0而分低于10分,必要保留十二人上的0;假设时辰是0而分小于10分的,则不需求保留12个人上的0。如1124象征11点24分,而905代表9点5分,36代表0点36分,7表示0点7分。

平价的输入范围是0到2359,即你的程序不容许从测量试验服务器读到0到2359以外的输入数据。

您的先后要出口这么些时间对应的UTC时间,输出的格式和输入的生机勃勃致,即出口叁个整数,表示UTC的时和分。整数的个位和九个人表示分,百位和千位表示时辰。假如小时小于10,则未有千位部分;假若小时是0,则从未百位部分;假如小时不是0而分低于10分,要求保留11位上的0;要是小时是0而分小于10分的,则无需保留11个人上的0。

唤醒:要小心跨日的折算。

输入格式:

贰个卡尺头,表示BJT的时和分。整数的个位和10位表示分,百位和千位表示小时。如若小时小于10,则从未千位部分;如若小时是0,则尚未百位部分;如若小时不是0而分紧跟于10分,必要保留十一位上的0;纵然小时是0而分小于10分的,则无需保留十一个人上的0。

出口格式:

四个卡尺头,表示UTC的时和分。整数的个位和10位表示分,百位和千位表示小时。即使小时小于10,则从未千位部分;假如小时是0,则从未百位部分;假如刻钟不是0而分低于10分,须要保留十个人上的0;假诺小时是0而分小于10分的,则无需保留十二人上的0。

输入样例:

803

输出样例:

3

时光节制:500ms内部存款和储蓄器限定:3二〇〇四kb

参谋代码:

# include <stdio.h>

int main()
{
    int i;
    scanf("%d",&i);
    if(i >= 0 && i <= 2359) {
        if(i > 0 && i < 10) {
            i = 1600 + i;
                printf("%d",i);
        }
        else if(i == 0){
            i = 1600;
                printf("%d",i);
        }
        else if(i >= 10 && i < 100 ){
            i = 1600 + i;
                printf("%d",i);
        }
        else if(i >= 100 && i < 1000) {
            if(i/100 == 8) {
                i = i % 100;
                    printf("%d",i);
            }
            else if(i/100 > 0 && i/100 < 8) {
                i = (i/100 - 8 + 24) *100 + (i % 100);
                    printf("%d",i);
            }
            else if(i/100 == 9) {
                i = (i/100 - 8)*100 + i % 100;
                    printf("%d",i);
            }
        }
        else if(i >= 1000 && i <= 2359) {
            i = (i /100 -8)*100 + (i % 100);
                printf("%d",i);
        }
    }
    return 0;
 }

2

时限信号报告(5分卡塔尔

标题内容:

有线电视台的瑞鹰S制信号报告是由三五个部分构成的:

  • ENCORE(Readability) 时限信号可辨度即清晰度.

  • S(Strength)    频限信号强度即大小.

在那之中中华V位于报告第二个人,共分5级,用1—5数字表示.

  1. Unreadable

  2. Barely readable, occasional words distinguishable

  3. Readable with considerable difficulty

  4. Readable with practically no difficulty

  5. Perfectly readable

告知第二个人是S,共分多少个等级,用1—9中的一个人数字代表

  1. Faint signals, barely perceptible

  2. Very weak signals

  3. Weak signals

  4. Fair signals

  5. Fairly good signals

  6. Good signals

  7. Moderately strong signals

  8. Strong signals

  9. Extremely strong signals

当今,你的次序要读入一个实信号报告的数字,然后输出对应的意思。如读到59,则输出:

Extremely strong signals, perfectly readable.

输入格式:

叁个整数,随机信号报告。整数的十一位部分代表可辨度,个位部分代表强度。输入的整数范围是[11,59]中的个位不为0的数字,那几个界定外的数字不容许出现在测验数据中。

输出格式:

一句话,表示那么些频域信号报告的意思。遵照难题中的文字,先输出表示强度的文字,跟上逗号和空格,然后是代表可辨度的文字,跟上句号。注意可辨度的句子的率先个假名是小写的。注意这里的标点都是德文的。

输入样例:

33

输出样例:

Weak signals, readable with considerable difficulty.

时限:500ms内部存储器约束:3二零零四kb

参照代码:

# include <stdio.h>
int main()
{
    int n;
    int R,S;
    scanf("%d",&n);
    R = n/10;
    S = n%10;
    switch(S) {
        case 1:
            printf("Faint signals, barely perceptible, ");
            break;
        case 2:
            printf("Very weak signals, ");
            break;
        case 3:
            printf("Weak signals, ");
            break;
        case 4:
            printf("Fair signals, ");
            break;
        case 5:
            printf("Fairly good signals, ");
            break;
        case 6:
            printf("Good signals, ");
            break;;
        case 7:
            printf("Moderately strong signals, ");
            break;
        case 8:
            printf("Strong signals, ");
            break;
        case 9:
            printf("Extremely strong signals, ");
            break;
    }
        switch(R) {
        case 1:
            printf("unreadable.");
            break;
        case 2:
            printf("barely readable, occasional words distinguishable.");
            break;
        case 3:
            printf("readable with considerable difficulty.");
            break;
        case 4:
            printf("readable with practically no difficulty.");
            break;
        case 5:
            printf("perfectly readable.");
            break;
    }
}

第3周:循环

 

第3周编程练习

利落时间:二零一四年十月4日 0:00

前往作业

学业项目

Online Judge作业

作业停止时间

2015年5月4日 0:00

培养发布时间

2015年5月4日 0:00

1

奇偶个数(5分卡塔 尔(英语:State of Qatar)

难题内容:

你的程序要读入意气风发连串正整数数据,输入-1代表输入达成,-1本身不是输入的多寡。程序输出读到的数据中的奇数和偶数的个数。

输入格式:

后生可畏比比皆已经正整数,整数的限量是(0,100000卡塔尔国。借使输入-1则象征输入完成。

输出格式:

三个整数,第贰个整数表示读入数据中的奇数的个数,第4个整数表示读入数据中的偶数的个数。多个整数之间以空格分隔。

输入样例:

9 3 4 2 5 7 -1 

出口样例:

4 2

时刻限制:500ms内部存款和储蓄器限定:3二〇〇二kb

# include <stdio.h>

int main()
{
    int i,j = 0,k = 0;
        scanf("%d",&i);
        while (i != -1) {

        if (i % 2 == 0) {
            ++j;
        }
        else {
            ++k;
        }
            scanf("%d",&i);
    }

    printf("%d %d",k,j);
    return 0;   
}

2

数字特征值(5分卡塔 尔(阿拉伯语:قطر‎

主题素材内容:

对数字求特征值是常用的编码算法,奇偶特征是黄金年代种简易的特征值。对于一个平头,从个位开端对每一人数字编号,个位是1号,拾个人是2号,就那样推算。这么些平头在第n位上的数字记作x,假若x和n的奇偶性相通,则记录几个1,不然记下二个0。依照整数的逐生龙活虎把对应位的意味奇偶性的0和1都记录下来,就形成了二个二进制数字。譬喻,对于342315,那些二进制数字正是001101。

此处的寻思能够用上边包车型大巴表格来表示:

数字

3

4

2

3

1

5

数位

6

5

4

3

2

1

数字奇偶

数位奇偶

奇偶一致

0

0

1

1

0

1

二进制位值

32

16

8

4

2

1

你的主次要读入多少个非负整数,整数的范围是[0,1000000],然后根据上述算法总结出代表奇偶性的那四个二进制数字,输出它对应的十进制值。

提醒:将整数从右向左分解,数位每趟加1,而二进制值每一趟乘2。

*
*

输入格式:

一个非负整数,整数的限制是[0,1000000]。

输出格式:

叁个整数,表示总结结果。

输入样例:

342315

输出样例:

13

时光限制:500ms内部存款和储蓄器限定:3二零零二kb

# include <stdio.h>

int main()
{
    int a,m,two = 1,s = 0;
    int cout = 0;
    scanf("%d",&a);
        while(a != 0) {
    m = a % 10;
    a /= 10;
    ++cout;
    if(m % 2 == cout % 2) {
        s += two;
    }
    two *= 2;

} 
printf("%d\n",s);
    return 0;
}

第4周:循环调整

 

第4周编制程序演练

甘休时间:2016年八月4日 0:00

前去作业

作业项目

Online Judge作业

学业甘休时间

2015年5月4日 0:00

成就公布时间

2015年5月4日 0:00

1

素数和(5分)

难点内容:

大家感到2是第多个素数,3是第三个素数,5是第多少个素数,依次类推。

现行反革命,给定多少个整数n和m,0<n<=m<=200,你的次序要总结第n个素数到第m个素数之间具备的素数的和,包蕴第n个素数和第m个素数。

输入格式:

五个整数,第二个代表n,第叁个表示m。

出口格式:

贰个卡尺头,表示第n个素数到第m个素数之间全体的素数的和,包含第n个素数和第m个素数。

输入样例:

2 4

出口样例:

15

时刻限制:500ms内部存款和储蓄器节制:3二〇〇〇kb

#include <stdio.h> 
int isPrime(long n); 
int main(int argc, char const *argv[]) 

{ 
    int n, m, count; 
    long l, sum; 
    while(1) { 
        scanf("%d%d", &n, &m);         
        if (n > 0 && n <= m && m <= 200) break; 
    }     
    count = 0; sum = 0; l = 2; 
    do { 
        if (isPrime(l)) { 
            count ++; 
            if (count >= n) sum += l; 
        }         
        l++; 
    } while (count < m); 
    printf("%d\n", sum); 
    return 0; 
} 
int isPrime(long n) 
{ 
    int i; 
    if (n == 2) 
        return 1; 
    for (i = 2; i*i <= n;i++) 
        if (n % i == 0) 
             return 0; 
     return 1; 
}

2

念整数(5分)

主题材料内容:

您的主次要读入一个卡尺头,范围是[-100000,100000]。然后,用中文拼音将这一个大背头的每壹个人输出出来。

如输入1234,则输出:

yi er san si

只顾,每种字的拼音之间有二个空格,不过最终的字背后未有空格。当境遇负数时,在出口的最初加上“fu”,如-2341输出为:

fu er san si yi

输入格式:

二个整数,范围是[-100000,100000]。

输出格式:

代表这几个板寸的每一种人数字的普通话拼音,每一个人数字的拼音之间以空格分隔,末尾未有空格。

输入样例:

-30

出口样例:

fu san ling

光阴限定:500ms内部存款和储蓄器限定:32004kb

# include <stdio.h>
# include <math.h>
int main()
{
    int n,c = 0;
    scanf("%d",&n);
    if(n == 0){
    printf("ling");
    }
    else{
        if(n < 0){
        printf("fu ");
        n = -n;
        }
        int t = n;
        while(t != 0){
            t /= 10;
            ++c;
        }
        int w = n,p,z;
        while(c > 0){
        z = pow(10.0,c-1);
        p = w / z;
        if(p == 0){
            printf("ling");
        }
        else if(p == 1){
            printf("yi");
        }
        else if(p == 2){
            printf("er");
        }
        else if(p == 3){
            printf("san");
        }
        else if(p == 4){
            printf("si");
        }
        else if(p == 5){
            printf("wu");
        }
        else if(p == 6){
            printf("liu");
        }
        else if(p == 7){
            printf("qi");
        }
        else if(p == 8){
            printf("ba");
        }
        else if(p == 9){
            printf("jiu");
        }
        if(c != 1){
            printf(" ");
        }
        c--;
        w = w - p*z;

        }
    }

    return 0;
 }

第5周:数据类型

 

先是次单元检查实验

得了时间:2014年三月4日 0:00

前去质量评定

试验得分:30.00分

结束时间

2015年5月4日 0:00

请必须在结束时间以前交付,截至时间后的付出不再计分

平价分数

30.00/30.00

您的每三次试验系统都将为您计分,并领取最高得分作为你的管用分数

平价提交次数

2/2

率先次单元检查测试

 返回

此番得分为:30.00/30.00, 此番测量检验的付出时间为:2015-03-31,
要是你感觉此番测量检验战绩不地道,你能够选择再做一回,也得以去考试作业商讨区享受你的测验战绩和设法。

1

单选(2分)

以下代码片段的出口是:

int j=4;

for ( int i=j; i<=2*j; i++ ) {

switch ( i/j ) {

case 0:

case 1: printf(“*”); break;

case 2: printf(“#”);

}

}

得分/总分

  • A.

    ****

  • B.

    *#

  • C.

    ****#

     2.00 /2.00

  • D.

    ***#

2

单选(2分)

下列程序段输出结果为:

int x=1, y=012;

printf(“%d”,y*x++);

得分/总分

  • A.

    12

  • B.

    20

  • C.

    24

  • D.

    10

     2.00 /2.00

3

单选(2分)

以下哪些不是C语言的首要字?

得分/总分

  • A.

    include

     2.00 /2.00

  • B.

    int

  • C.

    if

  • D.

    for

4

单选(2分)

以下哪些直接量是十进制的124?

得分/总分

  • A.

    124d

  • B.

    0124

  • C.

    0x124

  • D.

    124

     2.00 /2.00

5

单选(2分)

对于以下代码:

int i=6;

if ( i<= 6 ) 

printf(“hello\n”);;

else

printf(“bye-bye\n”);;

哪句话是对的?

得分/总分

  • A.

    打印出”hello”

  • B.

    没辙编写翻译

     2.00 /2.00

  • C.

    打印出”hello bye-bye”

  • D.

    打印出”bye-bye”

6

单选(2分)

对于以下代码:

int i,j=6;

以下哪句话是没错?

得分/总分

  • A.

    i不会被起始化,而j是6

     2.00 /2.00

  • B.

    i被先导为0,而j是6

  • C.

    i和j的先导值都以6

  • D.

    无法因此编写翻译

7

单选(2分)

对此以下代码:

char ch = -1;

printf(“%d\n”, ch);

出口结果是?

得分/总分

  • A.

    255

  • B.

    -1

     2.00 /2.00

  • C.

    编写翻译错误,因为赋值的时候类型不平等

  • D.

    编写翻译错误,因为赋值的时候无法把负数赋给char

8

单选(2分)

对此以下代码:

int i=6;

do {

printf(“%d”, i–);

} while (0);

哪句话是没错?

得分/总分

  • A.

    打字与印刷不出东西

  • B.

    因为while(0),无法编写翻译

  • C.

    打印出6

     2.00 /2.00

  • D.

    打印出5

9

单选(2分)

对此以下代码:

int i;

for ( i=0; i<10; i++)

printf("%d", i);

for循环甘休后,i的值是多少?

得分/总分

  • A.

    9

  • B.

    10

     2.00 /2.00

  • C.

    11

  • D.

    i未有规定的值

10

单选(2分)

以下哪些for语句是破绽百出的?

得分/总分

  • A.

    for (i=0; i<10, j<10; i++);

  • B.

    for (i=0; i<10; i–);

  • C.

    for (i=0; i++ );

     2.00 /2.00

  • D.

    for (;;);

11

填空(2分)

表明式ch =‘B’+‘8’-‘3’表示的字符是:

得分/总分

G

请输入答案

 2.00/2.00

12

填空(2分)

以下代码的出口是 _____.

int x=0, y=0, z=0;

z = (x==1) && (y=2);

printf(“%d “, y);

得分/总分

0

请输入答案

 2.00/2.00

13

填空(2分)

以下代码段的结果是:
int i=10; long long t = sizeof(i++); printf("%d", i);

得分/总分

10

请输入答案

 2.00/2.00

14

填空(2分)

表达式(double)(10/4*4) 的结果是_____

得分/总分

8.000000

请输入答案

 2.00/2.00

15

填空(2分)

以下代码的输出是 :

int i,x,y;i=x=y=0;do {++i;if ( i%2 ) x+=i, i++;y +=i++;} while ( i<=7
);printf(“%d %d %d”, i, x, y);

得分/总分

9 1 20

 

第5周编程练习

停止时间:二零一四年10月4日 0:00

前往作业

学业项目

Online Judge作业

作业结束时间

2015年5月4日 0:00

实际业绩宣告时间

2015年5月5日 0:00

1

高精度小数(10分)

难点内容:

出于计算机内部表明情势的限定,浮点运算都有精度难题,为了得到高精度的计算结果,就须求本人规划实现形式。

(0,1)之间的任何浮点数都能够表明为八个正整数的商,为了发挥这么五个数的商,能够将相除的结果以三个整数来表示,各种整数表示结果的一个人。即商的首先位用多个整数来表示,第几个人用另二个板寸来代表,依此类推,就足以出口多个高精度的除法结果了。

如16/19的结果0.8421052631…就能够依次输出8、4、2、1、0、5、2、6、3、1…。

而除法的进度,则足以上行下效人工列竖式做除法的主意,先将被除数乘以10,拿到一个人商以往,将余数乘以10当做下风度翩翩轮总计的被除数:

    160/19->8余8

    80/19->4余4

    …

当某次余数为0时,则注脚除尽。

到现在,请写多个主次,输入两个分数,总计出它的小数方式。无论是不是足以除尽,输出最多小数点后200位。

输入格式:

形如

    a/b

的四个数,在那之中10<=a<b<100。相当于说,那么些小数一定是仅次于1的正数。

唤醒:输入是带着四个数中间的“/”的,所以scanf应利用“%d/%d”那样的输入格式。

输出格式:

形如

    0.xxxxxxxxx

的小数,小数点后最多200位。输出甘休的时候要带着回车换行。纵然a/b是三个有限不循环小数,则输出完全体的得力位就足以了,无需再出口前面包车型地铁0来凑满200位。

输入样例:

16/19

输出样例:

0.84210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684

时光节制:500ms内部存款和储蓄器节制:3二〇〇三kb

# include <stdio.h>
int main()
{
    int n,m,c = 0;
    scanf("%d/%d",&n,&m);
    printf("0.");
    while ( c < 200) {
        c++;
        n *= 10;
        printf("%d",n/m);
        n %= m;
        if ( n == 0)
        break;
    }

    return 0;
}

第6周:函数

 

第6周编制程序演练

终止时间:2016年3月4日 0:00

前去作业

学业项目

Online Judge作业

学业甘休时间

2015年5月4日 0:00

成绩发表时间

2015年5月5日 0:00

1

分解质因数(5分卡塔 尔(阿拉伯语:قطر‎

主题素材内容:

各类非素数(合数卡塔 尔(英语:State of Qatar)都得以写成多少个素数(也可称为质数卡塔 尔(英语:State of Qatar)相乘的款型,那多少个素数就都叫作这么些合数的质因数。比方,6足以被分解为2×3,而24方可被讲解为2x2x2x3。

今昔,你的程序要读入一个[2,100000]约束内的卡尺头,然后输出它的质因数分解式;当读到的正是素数时,输出它本人。

提醒:能够用三个函数来判定某数是不是是素数。

输入格式:

八个整数,范围在[2,100000]内。

出口格式:

形如:

n=axbxcxd

n=n

负有的符号之间都不曾空格,x是小写字母x。abcd那样的数字肯定是从小到大排列的。

输入样例:

18

输出样例:

18=2x3x3

日子范围:500ms内部存款和储蓄器约束:3二〇〇四kb

# include <stdio.h>
int is(int i) {
    int j;
    for ( j = 2; j < i; ++j ) {
        if ( i%j == 0)
        break;
    }       
    if ( j != i)
    return 0;
    else
    return 1;
}
int main()
{
    int n,i;
    scanf("%d",&n);
    printf("%d=",n);
    if ( is(n))
    printf("%d\n",n);

    else 
    {
        while ( n != 1 ){
            for ( i = 2; i <= n; ++i) {
                if (is(i) && n%i == 0){
                    printf("%d",i);
                    if ( i != n)
                    printf("x");
                    else
                    printf("\n");
                    n /= i;
                    i = 1;
                }
            }
        }

    }

    return 0;
}

2

完数(5分)

标题内容:

三个正整数的因数是富有能够整除它的正整数。而二个数要是适逢其时等于除它自个儿外的因子之和,那些数就叫做完数。举个例子6=1+2+3(6的因子是1,2,3)。

今昔,你要写四个主次,读入多个正整数n和m(1<=n<m<1000卡塔尔,输出[n,m]范围内部存储器有的完数。

提示:能够写二个函数来判断有些数是不是是完数。

输入格式:

七个正整数,以空格分隔。

出口格式:

当中全数的完数,以空格分隔,末了贰个数字背后未有空格。若无,则输出意气风发行文字:

NIL

(输出NIL八个大写字母加回车卡塔尔国。

输入样例:

1 10

出口样例:

6

岁月范围:500ms内存约束:3二零零一kb

# include <stdio.h>
int w(int n)
{

int i,s = 0;

    for ( i = 1; i < n; ++i) {
        if ( n%i == 0){
            s += i;
        }
    }
    if ( n == s)
    return 1;
    else 
    return 0;
}
int main()
{
    int i,j,k,c = 0;
    scanf("%d%d",&i,&j);
    for ( k = i; k <= j; ++k) {
        if (w(k)) {
            if ( c == 2)
            printf(" ");

            printf("%d",k);
                c = 1;
                c++;

        }
    }
    if ( k == j+1 && c != 0)
    printf("\n");
    if (c == 0 )
    printf("NIL\n");
    return 0;
}

第7周:数组

 

第7周编制程序练习

甘休时间:2014年7月4日 0:00

前去作业

作业项目

Online Judge作业

作业甘休时间

2015年5月4日 0:00

培育宣告时间

2015年5月5日 0:00

1

多项式加法(5分卡塔尔

主题素材内容:

一个多项式可以表明为x的各次幂与全面乘积的和,举个例子:

2×6+3×5+12×3+6x+20

到现在,你的前后相继要读入四个多项式,然后输出那四个多项式的和,也正是把相应的幂上的周密相加然后输出。

前后相继要管理的幂最大为100。

输入格式:

合计要输入多少个多项式,每种多项式的输入格式如下:

每行输入多少个数字,第叁个象征幂次,第1个代表该幂次的周到,全部的全面都以整数。第黄金年代行显明是参天幂,最终风度翩翩行一定是0次幂。

介怀第生机勃勃行和最终大器晚成行之间不必然遵照幂次减弱顺序排列;假若某些幂次的周全为0,就不出未来输入数据中了;0次幂的周到为0时还是会冒出在输入数据中。

出口格式:

从高高的幂初叶逐项降至0幂,如:

2×6+3×5+12×3-6x+20

专一个中的x是小写字母x,况且富有的符号之间都不曾空格,假设有个别幂的周全为0则无需有那项。

输入样例:

6 2

5 3

3 12

1 6

0 20

6 2

5 3

2 12

1 6

0 20

出口样例:

4×6+6×5+12×3+12×2+12x+40

岁月范围:500ms内部存款和储蓄器限定:3二〇〇〇kb

#include <stdio.h>
#include <math.h>

void outNum(int j,int k)
{
    int absk = abs(k);
    if(absk==1 && j!=1 && j!=0)
    {
        printf("x%d",j);
    }
    else if(absk==1 && j!=0)
    {
        printf("x");
    }
    else if(absk==1)
    {
        printf("%d",absk);
    }
    else if(j==0)
    {
        printf("%d",absk);
    }
    else if(j==1)
    {
        printf("%dx",absk);
    }
    else
    {
        printf("%dx%d",absk,j);
    }

}

int main()
{
    int num[101] = { (0) };
    int cut = 0;
    int ent = 0;
    int i,j,k;
    while(cut < 2)
    {
        k=0;
        scanf("%d %d",&j,&k);
        num[j] += k;
        if(j==0)
            cut++;
    }

    for(i=100;i>-1;i--)
    {
        j=i;
        k=num[j];
        if(k!=0)
        {
            ent++;
            if(cut==2)
            {
                if(k<0)
                    printf("-");
                outNum(j,k);
                cut ++;
            }
            else
            {
                if(k<0)
                {
                    printf("-");
                    outNum(j,k);
                }
                else
                {
                    printf("+");
                    outNum(j,k);
                }
            }
        }
    }
    if(ent==0)
        printf("0");

    return 0;
}

2

鞍点(5分)

标题内容:

给定八个n*n矩阵A。矩阵A的鞍点是二个职分(i,j卡塔尔国,在该职责上的成分是第i行上的最大数,第j列上的小小数。一个矩阵A也恐怕未有鞍点。

你的职责是找出A的鞍点。

输入格式:

输入的第1行是贰个正整数n,
(1<=n<=100卡塔 尔(阿拉伯语:قطر‎,然后有n行,每后生可畏行有n个整数,同大器晚成行上多少个整数之间有八个或七个空格。

输出格式:

对输入的矩阵,即使找到鞍点,就输出其下标。下标为八个数字,第贰个数字是行号,第二个数字是列号,均从0开头计数。

假诺找不到,就输出

NO

难点所给的数量保险了不会现身五个鞍点。

输入样例:

1 7 4 1 

4 8 3 6 

1 6 1 2 

0 7 8 9

出口样例:

2 1

岁月范围:500ms内部存款和储蓄器限定:3二零零一kb

#include <stdio.h>

#define M 100
#define N 100

int main(void) {
    int i,j,m,n;
    int max,jmax,flag,f = 1;
    int a[M][N];
    while(scanf("%d",&n) != EOF){
        for(i = 0; i < n; ++i)
        for(j = 0; j < n; ++j)
        scanf("%d",&a[i][j]);

        for(i = 0; i < n; ++i){
            max = a[i][0];
            jmax = 0;
            for(j = 1; j < n; ++j) { 
                if(max < a[i][j]){
                    max = a[i][j];
                    jmax = j; 
               }
            }
            flag = 1; 
            int ii;
            for(ii = 0; ii < n && flag; ++ii) { 
                if(a[ii][jmax] < max) 
                    flag = 0;
            }
            if(flag == 1){
                printf("%d %d\n",i,jmax);
                f = 0;
            }
        }
        if(f) printf("NO\n");
    }
    return 0;
}

第八周:指针与字符串

 

第8周编制程序演练

得了时间:2014年5月4日 0:00

前往作业

作业项目

Online Judge作业

作业结束时间

2015年5月4日 0:00

实际业绩发表时间

2015年5月5日 0:00

1

单词长度(4分卡塔 尔(英语:State of Qatar)

难题内容:

您的顺序要读入意气风发行文本,当中以空格分隔为几个单词,以‘.’甘休。你要出口那行文本中各种单词的长度。这里的单词与语言非亲非故,能够归纳各类符号,举个例子“it’s”算叁个单词,长度为4。注意,行中只怕现身一而再再三再四的空格。

输入格式:

输入介意气风发行中付出意气风发行文本,以‘.’甘休,结尾的句号不可能忖度在最后二个单词的长短内。

输出格式:

在豆蔻梢头行中输出这行文本对应的单词的长短,各类长度之间以空格隔开分离,行末未有末了的空格。

输入样例:

It’s great to see you here.

出口样例:

4 5 2 3 3 4

时间约束:500ms内部存款和储蓄器限定:3二零零一kb

#include <stdio.h>
int main()
{   int i=0;
    char a;
    while(1){
        scanf("%c",&a);
        if(a == '.'){
                        if(i!=0){
                                printf("%d",i);
                        }
                        printf("\n");
                        break;
                }
        if(a==' '){
                        if(i!=0){
                                printf("%d ",i);
                                i=0;
                        }
                }
        else{
                i+=1;
        }
    }
return 0;
}

2

GPS数据处理(6分卡塔尔

难点内容:

NMEA-0183研讨是为着在差别的GPS(全世界定位系统卡塔尔导航设施中创造联合的BTCM(海事无线电技委卡塔尔国标准,由美利坚合营国国家海洋电子组织(NMEA-The
National 马林e Electronics
Associa-tion卡塔尔制订的生机勃勃套通信合同。GPS选择机根据NMEA-0183共谋的标准标准,将位置、速度等消息通过串口传送到PC机、PDA等设备。

NMEA-0183商讨是GPS选用机应当听从的规范契约,也是这段时间GPS选拔机上使用最广大的商业事务,大多数广大的GPS选取机、GPS数据管理软件、导航软件都服从只怕起码包容那么些协议。

NMEA-0183会谈定义的言辞非常多,不过常用的恐怕说宽容性最广的说话独有$GPGGA、$GPGSA、$GPGSV、$GPRMC、$GPVTG、$GPGLL等。

内部$GPRMC语句的格式如下:

    $GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50

此间整条语句是二个文本行,行中以逗号“,”隔绝种种字段,每种字段的深浅(长度卡塔 尔(阿拉伯语:قطر‎不意气风发,这里的演示只是黄金时代种恐怕,并不可能以为字段的高低好似上述例句同样。

    字段0:$GPRMC,语句ID,证明该语句为Recommended 迷你mum Specific
GPS/TRANSIT Data(RMC卡塔 尔(英语:State of Qatar)推荐最小定位音讯

    字段1:UTC时间,hhmmss.sss格式

    字段2:状态,A=定位,V=未定位

    字段3:纬度ddmm.mmmm,度分格式(前导位数不足则补0卡塔 尔(阿拉伯语:قطر‎

    字段4:纬度N(北纬)或S(南纬)

    字段5:经度dddmm.mmmm,度分格式(前导位数相差则补0)

    字段6:经度E(东经)或W(西经)

    字段7:速度,节,Knots

    字段8:方位角,度

    字段9:UTC日期,DDMMYY格式

    字段10:磁偏角,(000 – 180卡塔尔国度(前导位数相差则补0卡塔尔

    字段11:磁偏角方向,E=东W=西

    字段16:校验值

这里,“*”为校验和识别符,其背后的两位数为校验和,代表了“$”和“*”之间全部字符(不包含那三个字符卡塔 尔(英语:State of Qatar)的异或值的十三进制值。上面这条例句的校验和是十一进制的50,约等于十进制的80。

唤醒:^运算符的效果与利益是异或。将$和*里头全体的字符做^运算(第一个字符和第二个字符异或,结果再和第四个字符异或,就那样推算)之后的值对65536取余后的结果,应该和*末端的四个十七进制数字的值相当,不然的话说明那条语句在传输中发生了错误。注意那么些十二进制值中是会冒出A-F的大写字母的。

最近,你的程序要读入一应有尽有GPS输出,当中包蕴$GPRMC,也隐含其余语句。在数据的末尾,有黄金年代行单独的

    END

代表数据的终结。

您的主次要从当中寻觅$GPRMC语句,总计校验和,寻找里面校验正确,而且字段2代表已定位的语句,从当中计算出时间,换算成东方之珠时间。贰回数据中会满含多条$GPRMC语句,以最后一条语句获得的东方之珠时间作为结果输出。

你的程序一定会读到一条有效的$GPRMC语句。

输入格式:

多条GPS语句,每条均以回车换行截至。最终大器晚成行是END多少个大写字母。

出口格式:

6位数岁月,表明为:

    hh:mm:ss

里面,hh是两位数的钟点,不足两位时前边补0;mm是两位数的分钟,不足两位时前边补0;ss是两位数的秒,不足两位时前面补0。

输入样例:

$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50

END

出口样例:

10:48:13

时刻节制:500ms内部存款和储蓄器约束:3二〇〇〇kb

#include "stdio.h"
#include "string.h"
int main()
{
    int i,j,k,sum=0,r,num,t,d;
    char c[80][100];
    char time[9]="00:00:00";
    for(i=0;;i++)
    {
        gets(c[i]);
        if(c[i][0]=='E'&&c[i][1]=='N'&&c[i][2]=='D'&&c[i][3]=='\0')
        {

            num=i;break;
           }

    }

    for(i=0;i<num;i++)

    {
        if(c[i][0]=='$'&&c[i][1]=='G'&&c[i][2]=='P'&&c[i][3]=='R'&&c[i][4]=='M'&&c[i][5]=='C'&&c[i][6]!='\0')
        {

          sum=0;
            for(j=1;c[i][j]!='*';j++)
            {

                sum=sum^c[i][j];

            }
            if(c[i][j+1]>='0'&&c[i][j+1]<='9')

                r=16*(c[i][j+1]-'0');

            else r=16*(c[i][j+1]-'A'+10);




            if(c[i][j+2]>='0'&&c[i][j+2]<='9')

                r=r+c[i][j+2]-'0';

            else r=r+c[i][j+2]-'A'+10;



            for(k=0;!(c[i][k]=='A'||k=='V');k++)

            {

                ;

            }

            if(sum==r&&c[i][k]=='A')
            {
            time[3]=c[i][9],time[4]=c[i][10],time[6]=c[i][11],time[7]=c[i][12];

            t=10*(c[i][7]-'0')+c[i][8]-'0';

            t=(t+8)%24;

            if(t<10)

            {

                time[0]='0',time[1]='0'+t;

            }

            else 

            {

                time[1]=(t%10)+'0',time[0]=(t-t%10)/10 + '0';

            }

            }

        }

    }

    for(i=0;i<8;i++)

    {

        printf("%c",time[i]);

    }
    return 0;

}

此题有仿照效法研商区的心上人做出的解答,在那给与非常的谢谢,同时研讨区的同桌做出的解答越来越好些,附上链接
商量区地址:

http://mooc.study.163.com/learn/ZJU-1000002011?tid=1000003007\#/learn/forumdetail?pid=1000078086[点击打开链接](http://mooc.study.163.com/learn/ZJU-1000002011?tid=1000003007#/learn/forumdetail?pid=1000078086)



相关文章