乙级: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;
}