PAT程序设计题答案

乙级:1001

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

#include <iostream>
using namespace std;

int main()
{
    int n,num = 0;
    cin >> n;
    if (n > 1000)
    {
        cout << "n is too big.";
    }
    
    if (n == 1)
    {
        cout << ++num << endl;
    }
    
    while(n!=1){
        if (n % 2 == 0){
            n =n/2;
        }
        else{
            n = (3*n+1)/2;
        }
        num ++;
    }
    
    cout << num << endl;
    return 0;
}

1002:读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字

#include <iostream>
using namespace std;

void pinying(int num)
{
    switch (num) {
    case 0:cout << "ling"; break;
    case 1:cout << "yi"; break;
    case 2:cout << "er"; break;
    case 3:cout << "san"; break;
    case 4:cout << "si"; break;
    case 5:cout << "wu"; break;
    case 6:cout << "liu"; break;
    case 7:cout << "qi"; break;
    case 8:cout << "ba"; break;
    case 9:cout << "jiu"; break;
    }
}


int main(int argc, char const* argv[])
{
    char a[101];
    cin >> a;
    int sum = 0, i = 0;
    while(a[i]!= '\0')
    {
        sum = sum + a[i];
        sum = sum - '0';
        i++;
    }

    int j=0, b[11];
    if (sum == 0)
    {
        pinying(sum);
        return 0;
    }

    while (sum != 0)
    {
        b[j] = sum % 10;
        sum  = sum/10;
        j++;
    }

    for (i = j - 1; i > 0; i--)
    {
        pinying(b[i]);
        cout << " ";
    }
   pinying(b[0]);

    return 0;
}

1003 我要正确

#include <iostream>
#include <vector>
using namespace std;

//判断是否符合等式lena * lenb == lenc
void JudgeisYes(string word)
{
    int length = word.length();
    int lena = 0, lenb = 0, lenc = 0;
    int cnt = 0;
    for (int i = 0; i <= length-1; i++)
    {
        if (word[i] != 'P')
        {
            lena++;
        }
        else {
            break;
        }
    }

    for (int i = 0; i <= length-1; i++)
    {
        if (word[i] != 'T')
        {
            cnt++;
        }
        else
        {
            lenb = cnt - lena - 1;
            lenc = length - cnt - 1;
            break;
        }
    }

    if (lenb == 0)
    {
        cout << "NO" << endl;
        return;
    }
    else
    {

        if (lena * lenb == lenc) {
            cout << "YES" << endl; 
        }
        else {
            cout << "NO" << endl;
        }
    }

    return;
}
//先进行字符串验证,字符串是否出现其他字符,如果出现则为错误
bool CheckPat(string word)
{
    int length = word.length();
    for (int i = 0; i <= length - 1; i++)
    {
        if (word[i] != 'P' && word[i] != 'A' && word[i] != 'T')
        {
            return false;
        }
    }
    return true;

}

//总体实现思路为:
//1.根据三个条件,确定判断逻辑,可知P前面的A字符,即a 乘以 P和T之间的A字符 即b 等于 T后面的A字符个数,判断为yes的条件即为lena * lenb == lenc;
//2.同时判断字符串是否只含有PAT这三个字符,否则也为NO
//3.用了迭代器vector进行存储数据,同时用For进行循环遍历每个字符,lena个数判断为P前面,lenb为T前面的总字符个数减lena - 1,1为P,c的个数为总字符串长度减去T前的个数再-1,由此来判断字符串是否符合条件。
int main(int argc, char const* argv[])
{   
    vector <string> data;
    int n,i;
    string word;
    cin >> n;

    for ( i= 0; i < n; i++)
    {
        cin >> word;
        data.push_back(word);
    }

    for (i = 0; i < n; i++) 
    {
        if (CheckPat(data[i]))
        {
            JudgeisYes(data[i]);
        
        }
        else {

            cout << "NO" << endl;
        }
    }

    return 0;
}

1004: 成绩排名 读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。


#include <stdio.h>
#include<string.h>
#include<iostream>

#define N 10

//冒泡解决, 复杂度N^2 如果将数据向后移动,会出现未赋值区域的值赋值到申请区域,具体为什么,没搞懂
int main()
{
	struct student
	{
		char no[20];
		char name[20];
		int grade;
	};

	struct student s[N],t;

	int n, i, j;

	scanf("%d", &n);

	for (i = 0; i < n; i++)
	{
		scanf("%s %s %d", s[i].name, s[i].no, &s[i].grade);
	}


	for (i = 0; i < n - 1; i++)
	{
		for (j = 0; j < n - i; j++)
		{
			if (s[j].grade < s[j + 1].grade)
			{
				t = s[j];
				s[j] = s[j+1];
				s[j+1] = t;
			}
		}
	}

	printf("%s %s\n", s[0].name, s[0].no);

	for (i = 0; i < n - 1; i++)
	{
		for (j = 0; j < n - i; j++)
		{
			if (s[j].grade > s[j + 1].grade)
			{
				t = s[j];
				s[j] = s[j + 1];
				s[j + 1] = t;
			}
		}
	}
	
	printf("%s %s\n", s[0].name, s[0].no);

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值