第一题:判断是否等差数列(仅供参考)
1、题目介绍
(1)若为等差数列,则返回Yes;
(2)若不为等差数列,则返回No;
2、解题思路
(1)对n个整数进行排序(从小到大)
(2)遍历n个整数,判定等差是否相等
3、测试用例
输入说明:多组数据,每组输入数据由两行组成,第一行只有一个整数n(n<1000),表示序列长度,0表示输入结束,第二行为n个整数,每个整数的取值区间都为[-32768-32767],整数之间以空格间隔。
输出说明:对于每一组数据,输出一个yes或者no,表示该序列是否构成等差数列。
输入样本:
6
23 15 4 18 35 11
3
3 1 2
0
输出样本:
Yes
No
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{int n, line;vector <string> result;cin>>n;while(n!=0){if (n == 1) // 当只有一个整数时,就是等差数列 {result.push_back("No");}else {int *arr = new int[n];for(int i=0; i < n; i++)cin>>arr[i];sort(arr, arr+n); // 注意排序的参数,首地址+结束地址 line = arr[1] - arr[0];bool flag = true;for(int i = 2;i < n; i++){if (arr[i] - arr[i-1] != line){flag = false;break;}}if (flag == true)result.push_back("No");elseresult.push_back("Yes"); }cin>>n; }vector<string>::iterator iter;for(iter = result.begin(); iter != result.end(); iter++) cout<<*iter<<endl;return 0;}
第二题:判定给定正整数是否为“水仙花数”(仅供参考)
1、题目介绍
(1)若为水仙花数,则返回Yes;
(2)若不为水仙花数,则返回No;
(3)水仙花数:各位数字的立方和等于该数
2、该题难点
a.获得整数的各位数字
b.多组数据,每组数据要用一个动态数组(vector)存储结果
c.由于这里不知道测试用例的由多少,所以这里只有使用vector
3、测试用例
输入说明:有多组数据,每组数据为一个正整数n,占一行,为0时表输入结束。
输出说明:对于每一组数据,输出一个yes或者no。
input:
153
111
370
422
0
output:
yes
no
yes
no
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
int main()
{int n;vector <string> result;cin>>n;while(n != 0){// 获取每位的数字int sum = 0, temp = n;while(n != 0){sum += pow(n%10, 3);n = n / 10;} // 判定是否为水仙花数 if (sum == temp)result.push_back("yes");elseresult.push_back("no");cin>>n;}// 遍历动态数组vector,并且打印每个测试用例的结果 vector <string>::iterator t;for(t=result.begin(); t!=result.end();t++)cout<<*t<<endl;return 0;
}
第三题:判断是否等差数列(仅供参考)
1、题目介绍
Arnold变换是一种常见的图像置乱技术,Arnold变换定义如下:
对任意N*N矩阵(素有元素相同的矩阵除外)设i,j为矩阵元素的初始下标,经过Arnold变换后行下标为i',j',其满足下式
i'=(i+j)mod N
j' =(i+2j)mod N
其中i,j:0,1,2,...N-1
2、解题思路
问题转化求,矩阵任意一点,经过num次Arnold变换后,该点的行、列左边不变,而num就是周期
3、测试用例
输入说明:有多组数据,每组数据只有一个整数N(2<N<=10),占一行,为0表示输入结束。
输出说明:对输入的每一个N,给出N*N矩阵的Arnold变换的周期T
input:
3
8
0
output:
4
6
#include<iostream>
#include<vector>
using namespace std;
int main()
{int i=1, j=1; //矩阵任意一点,尽量选择下标小的,防止N太小,取不到 int num = 0, N, temp; // num记录进行Arnold变换次数,临时记录i值,便于跟新i,j值 vector <int> vec;cin>>N;while(N != 0){num++;// 更新i,j temp = i;i = (i+j) % N;j = (temp+2*j)%N;// 检验是否为变为原来矩阵 if (i == 1 && j == 1){vec.push_back(num);cin>>N;num = 0;}}// 遍历,并且打印各组测试用例结果 vector <int>::iterator t;for(t=vec.begin();t!=vec.end();t++)cout<<*t<<endl;return 0;
}
第四题:判断是否为Smith数(仅供参考)
1、题目介绍
Smith数:该整数的各位之和==其所有质因数的各位之和
如31257=3*3*23*151,各位数字之和==3+1+2+5+7,质因数各位数字之和==3+3+2+3+1+5+1
2、解题思路
备注:获取整数num的所有质因子
for i=2 to num
if (num % i == 0) //能整除,则i为质因子
num = num / i;
else
i++;
2、测试用例
输入说明:有多组数据,每组数据只有一个整数n(<100000,占一行),为0时表示输入结束。
输出说明:对于每组数据,输出一个yes或者no(表该数是否为Smith数)
input:
31257
123
0
output:
yes
no
#include<iostream>
#include<vector> using namespace std;
int getDataSum(int data)
{ // 获取整数各位数字之和 int sum = 0;while(data != 0){sum += data % 10;data = data / 10;}return sum;}
int getPrimeSum(int data)
{ // 获取所有质数的各位之和 int sum = 0;for(int i=2; i<=data;){if (data % i == 0) // i为质数 { sum += getDataSum(i); // 获取每个质数的每位之和 data = data / i; // 注意i没有变换 }elsei++;} return sum;}
int main()
{int num;vector <string> vec;while(true) // 无限循环,直到输入0为止 {cin>>num;if(num == 0)break;int sum1 = getDataSum(num); // 获取整数的各位数字之和 int sum2 = getPrimeSum(num); // 获取所有质数的各位数字之和 if (sum1 == sum2)vec.push_back("yes");elsevec.push_back("no");}// 遍历动态数组,并且打印结果 vector <string>::iterator t;for(t=vec.begin(); t!=vec.end();t++)cout<<*t<<endl;return 0;}
第五题:大数的幂运算,即计算R^n(仅供参考)
1、解题思路
将R转化为整数,其次结果R^n小数位数(不包括小数点)=R的小数位数*n;
1、测试用例
输入说明:有多组数据,每组数据占一行,用一对数据表示,第一个数据是R(含有小数点共6位),第二个数据是n,两个数之间有一个空格。
输出说明:对每个输入输出其结果占一行。
input:
95.123 12
0.4321 20
6.7592 9
98.999 10
1.0100 12
output:
548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
#include<iostream>
#include<vector> using namespace std;
int* Multiply(int *result, int data, int &len)
// result为运算结果,data乘数,len当前运算结果所的位数
{ // 获取整数各位数字之和 int carry = 0, i = 0; // carry进位// 计算结果result与R的乘积 for(i = 0; i < len; i++){result[i] = result[i] * data + carry;carry = result[i] / 10;result[i] = result[i] % 10;}// 进位while(carry) // 若进位不为零,则一直进位 {result[i++] = carry % 10;carry = carry / 10;} len = i; // i从0开始的,所有i++后,才是当前乘法后的位数。 return result;} int main()
{string R; int n; vector <string> vec;while(cin>>R>>n){int len = 1; // 初始化运算结果所占位数 int num = 0, position = 0; // num为浮点数R转化为整数,position为小数部分的位数 int *result = new int[1000]; // 存储运算结果 for(int i = 0;i<1000;i++) // 每位存储结果初始化 result[i] = 0;// 将幂运算的底数转化为整数,以及计算幂运算后小数位数 for(int j = 0; j < R.length(); j++){if(R[j] == '.')position = (R.length() - j - 1) * n; // R^n小数位数elsenum = num * 10 + int(R[j])- 48; // 将R转化为整数 }result[0] = 1; // 最初运算结果 // 计算n次幂,其中不包括小数点 for(int j = 0; j < n; j++)result = Multiply(result, num, len);// 规格化运算结果string str = "";if (len < position) // 小数位数大于积位数,添加0 {str += '.'; // 添加小数点str.append(position-len, '0'); // 小数点后面用0填充 }int start_index = 0; // 记录最低位非零的位置 while (start_index < position && result[start_index] == 0) // 找到小数最低位的非零位置start_index++; for(int i = len - 1; i>=start_index; i--){if (len > position && i == position - 1)str += '.';char temp = result[i] + 48; // 将数字(0~9)转化为字符('0'~'9') str += temp;}vec.push_back(str); }// 遍历动态数组,并且打印结果 vector <string>::iterator t;for(t=vec.begin(); t!=vec.end();t++)cout<<*t<<endl;return 0;}