第一题:判断是否等差数列(仅供参考)
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");
else
result.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");
else
result.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没有变换
}
else
i++;
}
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");
else
vec.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小数位数
else
num = 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;
}