小陈寒假《算法笔记》刷题入门篇(1)入门模拟

算法笔记

备战PAT乙级,甲级考试


PAT B1001 害死人不偿命的(3n+1)猜想

卡拉兹(Callatz)猜想:

对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……

我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?

思路:这道还是蛮简单的哈
1.读入一个自然数n,用while语句反复判断n 是否为1;
2.如果n=1,则退出循环;如果n!=1,则判断是否是偶数,如果是偶数,则令n/2,否则令n为(3*n+1)/2,之后令计数器step+1;
3.输出step
`

#include <stdio.h>
int main(){
    int n,step=0;
    scanf("%d",&n);
    while(n!=1){
        if(n%2==0)
            n=n/2; //如果是偶数
        else
            n=(3*n+1)/2;//如果是奇数
        step++;
    }
    printf("%d\n",step);
    return 0;
}

PAT B1032 挖掘机技术哪家强

为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。

输入格式:
输入在第 1 行给出不超过 10 的正整数 N,即参赛人数。随后 N 行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从 1 开始连续编号)、及其比赛成绩(百分制),中间以空格分隔。

5

输出格式:
在一行中给出总得分最高的学校的编号、及其总分,中间以空格分隔。题目保证答案唯一,没有并列。

输入样例:

6
3 65
2 80
1 100
2 70
3 40
3 0

输出样例:

2 150

思路:这道题有个地方一次出错,现在还不知道为什么,以后再来看看。
1.读入数据schID,score
2.令数组school[maxn]记录每个学校的总分
3.令k记录总分最高的学校ID,MAX输出学校的总分

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
 
    const int maxn = 100010;
    int school[maxn];
    int n,schID,score;
 
    scanf("%d",&n);
    int i=-1;
    for(i = 0; i < n; i++)
    {
        scanf("%d%d",&schID,&score);
        school[schID]+= score;
    }
    int k = 1,MAX = -1;
    for (i=1 ;i<= n; i++)
    {
 
        if(school[i]>MAX){
            MAX=school[i];
            k=i;
        }
    }
    printf("%d %d\n", k, MAX);
    return 0;
}

codeup 1934: 找x

时间限制: 1 Sec 内存限制: 32 MB
献花: 707 解决: 321

[献花][花圈][TK题库]
题目描述
输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)。
输入
测试数据有多组,输入n(1<=n<=200),接着输入n个数,然后输入x。
输出
对于每组输入,请输出结果。
样例输入

4
1 2 3 4
3

样例输出

2
#include <stdio.h>

int main(){
    const int maxn = 210;
    int a[maxn];
    int n,x;
    while(scanf("%d",&n) != EOF){
    	for(int i=0;i<n;i++){
    		scanf("%d",&a[i]);
		}
		scanf("%d",&x);
		int k;
		for(k=0;k<n;k++){
			if(a[k]==x){
				printf("%d\n",k);
				break;
			}
		} 
		if(k==n){
			printf("-1\n");
		}
	} 
    return 0;
}

codeup 5901回文串

题目描述

读入一串字符,判断是否是回文串。“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。
输入
一行字符串,长度不超过255。
输出
如果是回文串,输出“YES”,否则输出“NO”。
样例输入

12321

样例输出

YES
#include <stdio.h>
#include <string.h>
const int maxn = 256;
bool judge(char str[]){
	int len = strlen(str);
	for(int i=0;i<len/2;i++){
		if(str[i]==str[len-i-1]){
			return true;
		}
		return false;
	}
}
int main(){
	char str[maxn];
	while(gets(str)){
		bool flag=judge(str);
		if(flag==true){
			printf("YES\n");
		}
		else{
			printf("NO\n");
		}
	}
	return 0;
}

PAT 1009 说反话 (20 分)

题目:给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。

输出格式:
每个测试用例的输出占一行,输出倒序后的句子。

输入样例:

Hello World Here I Come

输出样例:

Come I Here World Hello

思路:这里主要的一个想法就是以空格为分隔符,将单词存放到二维数组中ans[90] [90],最后倒序,只用输出ans【r】

#include <stdio.h>
#include <string.h>
int main(){
    char str[90];
    gets(str);
    int len = strlen(str);
    int r=0,h=0;
    char ans[90][90];
    for(int i=0;i<len;i++){
        if(str[i]!= ' '){
            ans[r][h++] = str[i];
        }else{
            ans[r][h] = '\0';
            r++;
            h = 0;
        }
    }
    for(int i=r;i>=0;i--){
        printf("%s",ans[i]);
        if(i>0)
            printf(" ");
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值