1、ASCII码排序 问题
输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符。
* 注意: 必须要把char 转换为 int 才能进行比较
2、奇偶数分离
有一个整型偶数n(2<= n <=10000),你要做的是:先把1到n中的所有奇数从小到大输出,再把所有的偶数从小到大输出。
*注意:分离奇偶数简单方法 for(int i=1; i<=n; i+=2) 和 for(int i=2; i<=n; i+=2)
3、A Famous Music Composer
有12个唯一的音符,有10个是重名的音符。
A A#=Bb B C C#=Db D D#=Eb E F F#=Gb G G#=Ab
样例输入Ab minor D# major G minor
Case 1: G# minor Case 2: Eb major Case 3: UNIQUE
* 学习这种什么情况下放在二维数组里
#include<iostream>
#include<string>
int main()
{
std::string a[5][2] = {{"A#","Bb"},{"C#","Db"},{"D#","Eb"},{"F#","Gb"},{"G#","Ab"}};
std::string name, ton;
int count = 0;
while(std::cin>>name)
{
std::cin>>ton;
++count;
bool isalt = false;
for(int i=0; i<5; ++i)
{
for(int k=0; k<2; ++k)
{
if(name == a[i][k])
{
if(k==0)
name = a[i][1];
if(k==1)
name = a[i][0];
isalt = true;
break;
}
}
if(isalt)
break;
}
if(isalt)
std::cout<<"Case"<<count<<": "<<name<<" "<<ton<<std::endl;
else
std::cout<<"Case"<<count<<": "<<"UNIQUE"<<std::endl;
}
return 0;
}
4、蛇形填数
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
-
输入
- 直接输入矩阵的维数,即n的值。(n<=100) 输出
- 输出结果是蛇形矩阵
- * 算法核心四个方向,下,左,上,右。注意 while(i<n-1 && !a[i+1][j]) 这个地方比较难。
#include <iostream>
#define MAX 100
int a[MAX][MAX];
int main()
{
int i, j, n, m;
m = 0;
memset(a, 0, sizeof(a));
std::cin>>n;
i=0;j=n-1;
a[i][j] = m = 1;
while (m<n*n)
{
while(i<n-1 && !a[i+1][j])
a[++i][j] = ++m;
while(j>=1 && !a[i][j-1])
a[i][--j] = ++m;
while(i>=1 && !a[i-1][j])
a[--i][j] = ++m;
while(j<n-1 && !a[i][j+1])
a[i][++j] = ++m;
}
for(int x=0; x<n; ++x)
{
for(int y=0; y<n; ++y)
{
std::cout<<a[x][y]<<' ';
}
std::cout<<std::endl;
}
return 0;
}
5、韩信点兵
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100 。
2 1 6
41
* 这种题都会有个核心算法,刚开始做这道题的时候看到网上有一种版本是
#include <iostream>
int main()
{
int a, b ,c,n;
std::cin>>a>>b>>c;
for(n=10; n<=100; ++n)
{
if(n%3==a && n%5==b && n%7==c)
{
std::cout<<n<<std::endl;
break;
}
if(n==100)
std::cout<<"No answer"<<std::endl;
}
return 0;
}
虽然结果是对的……但明显不是韩信点兵了啊!尼玛韩信要这样算,还不如一个一个的数呢,画蛇添足
正确的算法应该是:
3人一组时,5和7的倍数70 除3刚好余1,
5人一组时,3*7=21除5又刚好余1,
7人一组时,3*5=15除7还是余1。
将这些数加起来减去105,直到得到数比105小为止。取余数是个超棒的选择!!!
#include <iostream>
int main()
{
int a, b ,c, n;
std::cin>>a>>b>>c;
n = (a*70 + b*21 + c*15)%105;
if(n<10 && n>100)
std::cout<<"No answer"<<std::endl;
else
std::cout<<n<<std::endl;
return 0;
}
6、素数求和问题
现在给你N个数(0<N<1000),现在要求你写出一个程序,找出这N个数中的所有素数,并求和。
每组测试数据第一行给你N,代表该组测试数据的数量。
接下来的N个数为要测试的数据,每个数小于1000
3 5 1 2 3 4 5 8 11 12 13 14 15 16 17 18 10 21 22 23 24 25 26 27 28 29 30
10 41 52* 读取一行的每一个数是靠的n
#include <iostream>
int f(int i)
{
for(int k=2; k<i; ++k)
{
if(i%k == 0)
return 0;
}
return 1;
}
int main()
{
int n,m,i,sum;
std::cin>>m;
while (m--)
{
sum = 0;
std::cin>>n;
while(n--)//一行输入几个数据,知道是具体几个时
{
std::cin>>i;
if(f(i) && i!=1)
sum += i;
}
std::cout<<sum<<std::endl;
}
return 0;
}