cpp上机练习题第18次(一维数组应用)

1:数组-10

描述

把从某个数字开始起的10个素数存放在数组中,然后输出这10个素数的总和

输入

一个正整数n,表示n组案例。

每组案例由一个正整数m组成。

输出

针对每组案例,输出一个整数,表示大于等于m的最小10个不同素数的和。

每组案例输出完都要换行。

样例输入复制样例 

1

4

样例输出

192

提示说明

5+7+11+13+17+19+23+29+31+37=192

代码

#include<iostream>
#include<cmath>
using namespace std;
bool(isPrime(int m))
{
	if (m < 2) return false;
	for (int i = 2; i <= sqrt(m); i++)
	{
		if (m % i == 0) return false;
	}
	return true;
}
int main()
{
	int n;
	cin >> n;
	while(n--)
	{
		int m, sum = 0, cnt = 0;
		cin >> m;
		while(true)
		{
			if (isPrime(m))
			{
				cnt++;
				sum += m;
				if (cnt == 10) break;
			}
			m++;
		}
		cout << sum << endl;
	}
	return 0;
}

 注意退出循环这句话的摆放位置

2:数组-11

描述

输入n个数字,输出相邻的三个数字之和(有n个这样的和:第1、2、3,第2、3、4,...,第n-2、n-1、n,第n-1、n、1,第n、1、2)

输入

只有一组案例。

一个正整数n,然后是n个整数。

输出

n个数字,分别是以下n组数字的和:第1、2、3,第2、3、4,...,第n-2、n-1、n,第n-1、n、1,第n、1、2

每个数字之间用一个空格间隔,最后一个数字后面没有空格和换行。

样例输入复制样例 

5

1 2 3 4 5

样例输出

6 9 12 10 8

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin >> n;
	int* a = new int[n];
	int* b = new int[n];
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	for (int i = 0; i < n ; i++)
	{
		if (i != 0) cout << " ";
		cout<<a[i] + a[(i + 1) % n] + a[(i + 2) % n];
	}
	return 0;
}

 3:数组-12

描述

输入m个数字,输出其中出现次数最多的数字(保证只会有一个数字出现次数最多,不存在并列第一多)

输入

一个正整数n,表示n组案例。

每组案例中,首先是一个正整数m,然后是m个整数。

输出

针对每组案例,输出这m个整数中,出现次数最多的数字(保证只有一个数字)。

每组案例输出完都要换行。

样例输入复制样例 

1

5 1 2 3 1 4

样例输出

1

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin>>n;
	for (int i = 0; i < n; i++)
	{
		int m;
		cin >> m;
		int* a = new int[m];
		int b[100000] = { 0 };
		int c[100000] = { 0 };
		for (int j = 0; j < m; j++)
		{
			cin >> a[j];
			b[a[j]]++;//记数量
			c[b[a[j]]] = a[j];//返回数字
		}
		int max = b[0],on;
		for (int j = 1; j < 100000; j++)
		{
			if (b[j] > max) 
			{
				max = b[j];
				on = c[b[j]];
			}
		}
		cout << on<<endl;
	}
	return 0;
}

4:数组-13 

描述

输入 m 个正整数,输出其中出现次数最多的数字(可能有多个数字的出现次数并列第一多)

输入

第一行是一个正整数 n 表示测试用例的数量。

每组案例中,首先是一个正整数 m,然后是 m 个正整数,这些数字均不大于 1000。

输出

针对每组案例,输出这 m 个正整数中,出现次数最多的数字。

如果有多个数字出现次数并列最多,则按照从小到大的顺序输出这些数字,每个数字之间用一个空格间隔,最后一个数字之后没有空格。

每组案例输出完都要换行。

样例输入复制样例 

1

5 1 2 4 1 4

样例输出

1 4

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin >> n;
	while(n--)
	{
		int m;
		cin >> m;
		int a[1001]={0};
		for (int i = 0; i < m; i++)
		{
			int x;
			cin >> x;
			a[x]++;
		}
		int max = a[0];
		for (int i = 1; i < 1001; i++)
		{
			if (a[i] > max) max = a[i];
		}
		bool f = false; //FALSE表示还未看到出现次数最多的数字
		for (int i = 1; i < 1001; i++)
		{
			if(a[i]==max)
			{
				if (f) cout <<" ";
				else f = true;
				cout << i; //这里输出的是i,而不是a[i] ,因为a[i]表示次数
			}
		}
		cout << endl;
	}
	return 0;
}

5:综合-3

描述

统计m以内(小于等于m)同时满足以下三个条件的数字的总个数:1、是正整数;2、是完全平方数;3、各位数字上没有相同的数字。

输入

一个正整数n,表示有n组案例。

每组案例由一个正整数m构成(m可能有点大)。

输出

针对每组案例,输出m以内(小于等于m)同时满足以下三个条件的数字的总个数:1、是正整数;2、是完全平方数;3、各位数字上没有相同的数字(例如171,由于有两个1,所以不满足条件)。

每组案例输出完都要换行。

样例输入复制样例 

1

100

样例输出

9

提示说明

1 4 9 16 25 36 49 64 81都满足,100有2个重复的数字0,故不算。

写法一(这种会超时) 

#include<iostream>
#include<cmath>
using namespace std;
bool isSquare(int a)
{
	if (a < 0) return false;
	int b = (int)(sqrt(a) + 0.0001);
	if (a == b * b) return true;
	else return false;
}
bool  isDiff(int n)
{
	int a[10] = { 0 };
	while (n != 0)
	{
		int b = n % 10;;
		a[b]++;
		if (a[b] > 1) return false;
		n = n / 10;
	}
	return true;
}
int main()
{
	int n;
	cin >> n;
	while (n--)
	{
		int m,cnt=0;
		cin >> m;
		for (int i = 1; i <= m; i++)
		{
			if (isSquare(i) && isDiff(i)) cnt++;
		}
		cout << cnt << endl;
	}
	return 0;
}

 写法二:

#include<iostream>
#include<cmath>
using namespace std;
bool  isDiff(int n)
{
	int a[10] = { 0 };
	while (n != 0)
	{
		int b = n % 10;;
		a[b]++;
		if (a[b] > 1) return false;
		n = n / 10;
	}
	return true;
}
int main()
{
	int n;
	cin >> n;
	while (n--)
	{
		int m,cnt=0;
		cin >> m;
		for (int i = 1; i <= sqrt(m); i++)
		{
            //考虑i平方是否满足各位数字上有没有相同的数字
			if (isDiff(i*i)) cnt++;
		}
		cout << cnt << endl;
	}
	return 0;
}

 思路:题上让那个数是1.正整数;2、是完全平方数;3、各位数字上没有相同的数字。

结合一下就是,从1开始的,完全平方数且各位数字上没有相同的数字。其实我们只要判断完全平方数里面是否满足各位数字上有没有相同的数字。

理解:for (int i = 1; i <= sqrt(m); i++)

 6:数组综合-1

描述

在数组a中存放n个整数(n是偶数),定义函数void f(int a[], int n, int m),功能是把a中后一半的元素值增加m,其中函数形参中a表示数组,n表示数组长度,m表示后一半元素要增加的值。输出经由f函数变化前和变化后数组各元素的和。

输入

只有一组案例。

一个正整数n表示数组元素的个数(n是偶数);然后是n个整数,表示存放在数组中的元素值;最后是一个整数m,表示数组后一半元素要增加的值。

输出

两个整数,分别表示数组元素的总和,以及数组后一半元素增加m以后,所有元素的总和。两个数字中间有一个空格,不要换行。

请按照“描述”中要求定义的函数来实现对数组元素值的变更。

样例输入复制样例 

6

1 2 3 4 5 6

3

样例输出

21 30

#include<iostream>
using namespace std;
int main()
{
	int n, m;
	int sum1 = 0, sum2 = 0;
	cin >> n;
	int* a = new int[n];
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	for (int i = 0; i < n; i++)
	{
		sum1 += a[i];
	}
	cin >> m;
	for (int i = n / 2; i < n; i++)
	{
		a[i] += m;
	}
	for (int i = 0; i < n; i++)
	{
		sum2 += a[i];
	}
	cout << sum1 <<" " <<sum2;
	delete[]a;
	return 0;
}

 优化后:

#include<iostream>
using namespace std;
void f(int a[], int n, int m)
{
	int sum1 = 0, sum2 = 0;
	for (int i = 0; i < n; i++)
	{
		sum1 += a[i];
	}
	for (int i = n / 2; i < n; i++)
	{
		a[i] +=m;
	}
	for (int i = 0; i < n; i++)
	{
		sum2 += a[i];
	}
	cout << sum1 << " " << sum2;
}
int main()
{
	int n, m;
	int sum1 = 0, sum2 = 0;
	cin >> n;
	int* a = new int[n];
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	cin >> m;
	f(a, n, m);
	delete[]a;
	return 0;
}

7:数组综合-2

描述

数组a中的an个元素是按照从小到大的顺序排列,即下标较小的元素值不会大于下标较大的元素值。

数组b中的bn个元素也是按照从小到大的顺序排列。

现在要求综合地考虑数组a和数组b中的所有元素,按从小到大的顺序依次输出所有an+bn个元素值。

输入

一个正整数n,表示有n组案例。

每组案例中,先是两个正整数an和bn,分别表示数组a的元素个数和数组b的元素个数;(an<=1000000, bn<=1000000)

然后是an个从小到大排序过的整数,表示a数组各元素的值;

最后是bn个从小到大排序过的整数,表示b数组各元素的值。

输出

针对每组案例,输出an+bn个数字,表示c数组里各元素的值,每个数字之间有一个空格,最后一个数字后面不要有空格。

每组案例输出完都要换行。

样例输入复制样例 

1

5 3

2 4 6 8 10

1 4 9

样例输出

1 2 4 4 6 8 9 10

提示说明

不要用到排序

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin >> n;
	while(n--)
	{
		int an, bn;
		cin >> an >> bn;
		int* a = new int[an];
		int* b = new int[bn];
		int* c = new int[an + bn];
		for (int i = 0; i < an; i++)
		{
			cin >> a[i];
		}
		for (int i = 0; i < bn; i++)
		{
			cin >> b[i];
		}
		int indexA = 0, indexB = 0, indexC = 0;
		while (indexA < an && indexB < bn)
		{
			if (a[indexA] <= b[indexB])
			{
				c[indexC] = a[indexA];
				indexA++;
			}
			else 
			{
				c[indexC] = b[indexB];
				indexB++;
			}
			indexC++;
		}
		if (indexA < an)
		{
			for (int i = indexA; i < an; i++)
			{
				c[indexC] = a[i];
				indexC++;
			}
		}
		if (indexB < bn)
		{
			for (int i = indexB; i < bn; i++)
			{
				c[indexC] = b[i];
				indexC++;
			}
		}
		for (int i = 0; i < an + bn; i++)
		{
			if (i!=0) cout << " ";
			cout << c[i];
		}
		cout << endl;
		delete[]a;
		delete[]b;
		delete[]c;
	}
	return 0;
}

8:数列-1

描述

斐波那契数列是这样一组有规律的数字:1、1、2、3、5、8、13、21、34、…。这组数字的前两项都是1,从第三项开始,每个数字都是前两个数字的和。

把数列的前n项输出出来。

输入

一个正整数n(n>=2)

输出

n个整数,表示数列前n项。要求每两个数字之间有一个空格,最后那个数字后面不要有空格,直接换行。

样例输入复制样例 

4

样例输出

1 1 2 3

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin >>n;
	int* a = new int[n];
	for(int i=1;i<=n;i++)
	{
		if(i==1)  a[1] = { 1 };
		if (i == 2) a[2] = { 1 };
		if (i >= 3)  a[i] = a[i - 1] + a[i - 2];
	}
	for (int i = 1; i <= n; i++)
	{
		if (i != 1) cout << " ";
		cout << a[i];
	}
	cout << endl;
	return 0;
}

 9:数列-2

描述

斐波那契数列是这样一组有规律的数字:1、1、2、3、5、8、13、21、34、…。这组数字的前两项都是1,从第三项开始,每个数字都是前两个数字的和。

输出数列的第n项。

输入

一个正整数n

输出

一个整数,表示数列的第n项。不要换行

样例输入复制样例 

4

样例输出

3

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin >>n;
	int* a = new int[n];
	for(int i=1;i<=n;i++)
	{
		if(i==1)  a[1] = { 1 };
		if (i == 2) a[2] = { 1 };
		if (i >= 3)  a[i] = a[i - 1] + a[i - 2];
	}
	cout << a[n];
	return 0;
}

10:数列-3

描述

有一组有规律的数字:1、2、3、6、11、20、…。这组数字的前三项是1、2、3,从第四项开始,每个数字都是前三个数字的和。

输出数列的第n项。

输入

一个正整数n

输出

一个整数,表示数列第n项。不要换行。

样例输入复制样例 

4

样例输出

6

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin >> n;
	int* a = new int[n+1];
	for (int i = 1; i <= n; i++)
	{
		if (i <= 3)  a[i] = { i };
		if (i >= 4)  a[i] = a[i - 1] + a[i - 2] + a[i - 3];
	}
	cout << a[n];
	return 0;
}

 这里想下标对正,所以啊[0]不要。还想要n个数组的时候就要n+1

11:数列-4

描述

有一组有规律的数字:2、3、5、7、10、15、22…。这组数字的前三项是2、3、5,从第四项开始,每个数字都是前1项数字加上前3项数字的和。

输出数列的第n项。

输入

一个正整数n

输出

一个整数,表示数列第n项。不要换行。

样例输入复制样例 

4

样例输出

7

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin >>n;
	int* a = new int[n];
	for(int i=1;i<=n;i++)
	{
		if(i==1)  a[1] = { 2 };
		if (i == 2) a[2] = {3 };
		if (i == 3) a[3] = {5};
		if (i >= 4)  a[i] = a[i - 1] + a[i-3];
	}
	cout << a[n];
	return 0;
}

12:00漫山遍野的好人卡 

描述

00手上有非常多张(m张)好人卡,每天发1~3张,发完为止,问有多少种发送方法。注意:第一天发1张第二天发2张和第一天发2张第二天发1张,是两种不同的发送方法。

输入

第1行是一个正整数n,表示测试案例的数量。

从第2行到第n+1行,每行有1个正整数m(m<=50000000)。

输出

针对每组测试案例,计算这m张好人卡发送方法的总数,因为这个数字可能非常大,所以只要输出这个数字对100000007取模的结果。

每组案例输出完后都要换行。

样例输入复制样例 

2

3

100

样例输出

4

99298679

memory Limit Exceeded:

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin >> n;
	while (n--)
	{
		long long int m;
		cin >> m;
		int* a = new int[m];
		for (int i = 0; i <= m; i++)
		{
			if (i == 0) a[i] = { 0 };
			if (i == 1) a[i] = { 1 };
			if (i == 2) a[i] = { 2 };
			if (i == 3) a[i] = { 4 };
			if (i >= 4) a[i] = (a[i - 1] + a[i - 2] + a[i - 3]) % 100000007;
		}
		cout << a[m] << endl;
	}
	return 0;
}

 accept:

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin >> n;
	while (n--)
	{
		long long int m,t;
		int a = 1, b = 2, c = 4;
		cin >> m;
		for (int i =1; i < m; i++)
		{
			t = a;
			a = b;
			b = c;
			c = (t + a + b) % 100000007;
		}
		cout << a << endl;
	}
	return 0;
}

 用数组会超内存qvq

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值