C++算法题_03

  • 回形取数
//数组逆时针打印
#include<iostream>
using namespace std;
int main() {
  int n, m, i, j;
  cin >> m >> n;
  int arr[m][n];
  for (i = 0; i < m; i++) {
    for (j = 0; j < n; j++) {
      cin >> arr[i][j];
    }
  }
  for (i = 0; i < (m + 1) / 2 && i < (n + 1) / 2; i++) //每次打印都会打印一圈,所以会减少两行两列
  {
    for (j = i; j < m - i; j++) // 向下打印 
      cout << arr[j][i];
    for (j = i + 1; j < n - i; j++) // 向右打印 
      cout << arr[m - i - 1][j];
    if (n - i - 1 > i)          // 向上打印的条件 
    {
      for (j = m - i - 2; j >= i; j--)
        cout << arr[j][n - i - 1];
    }
    if (m - i - 1 > i)          // 向左打印的条件: 总列数 -
      // 第i次打印
      // ,因为每次打印下界限都要减去1 
      // 是否可以打印的条件是
      // 上下界限不重叠 
    {
      for (j = n - i - 2; j > i; j--)
        cout << arr[i][j];
    }
  }
  return 0;
}
  • 高精度加法
#include <iostream>
using namespace std;
#define M 100
int a[M], b[M], c[M];
int main() {
  int i, k;
  string e, f;
  cin >> e;
  cin >> f;
  for (i = 0; i < e.length(); i++)
    a[i] = e[i] - '0';
  for (i = 0; i < f.length(); i++)
    b[i] = f[i] - '0';
  for (i = 0; i < e.length() || i < f.length(); i++) {
    if (i < e.length())
      c[i] += a[e.length() - i - 1];
    if (i < f.length())
      c[i] += b[f.length() - i - 1];
    if (c[i] >= 10) {
      c[i + 1] = c[i] / 10;
      c[i] %= 10;
    }
  }
  for (i = M - 1; i > 0; i--)
    if (c[i])
      break;
  for (int j = i; j >= 0; j--)
    cout << c[j];
} 
  • 阶乘结果最右边非零元素
/* 
   问题描述
     一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积。阶乘的增长速度非常快,例如,13!就已经比较大了,已经无法存放在一个整型变量中;而35!就更大了,它已经无法存放在一个浮点型变量中。因此,当n比较大时,去计算n!是非常困难的。幸运的是,在本题中,我们的任务不是去计算n!,而是去计算n!最右边的那个非0的数字是多少。例如,5! 
   = 1*2*3*4*5 =
   120,因此5!最右边的那个非0的数字是2。再如:7! =
   5040,因此7!最右边的那个非0的数字是4。请编写一个程序,输入一个整数n(n<=100),然后输出n! 
   最右边的那个非0的数字是多少。
     输入格式:输入只有一个整数n。
     输出格式:输出只有一个整数,即n!
   最右边的那个非0的数字。 输入输出样例 样例输入 6
   样例输出 2 
*/
#include<string>
#include<iostream>
#include <sstream>
using namespace std;
long fac(int n)
{
	long int pro = 1;
	if (n == 1)
		return 1;
	else
		pro = fac(n - 1) * n;
	return pro;
}

int main()
{
	int N;
	cin >> N;
	cout << N << "!=" << fac(N) << endl;
	ostringstream os;
	os << fac(N);
	string result;
	istringstream is(os.str());
	is >> result;
	string b = result;
	int l = b.length();
	for (int i = l - 1; i > 0; i--)
	{
		if (b[i] != '0')
		{
			cout << b[i];
			break;
		}
	}
	 return 0;
}
  • 质数的和与积(两个质数的和是S,他们的积最大是多少?)
#include<iostream>
using namespace std;
int sushu(int a)
{
	 if (a < 2)
		return 1;
	for (int i = 2; i <= a - 1; i++)
	{
		if (a % i == 0)
		{
			return 0;
		}
	}
	return 1;
}

int main()
{
	int N,j=0;
	int sum=1;
	cin >> N;
	for(int i=50;i>0;i--){
	if (sushu(i) && sushu(j))
		{
			if(i*j>sum)
			{
			sum=i*j;
			cout << "这个数"<<i<<","<<j<<"是素数\n";
		}
		}
		j++;
	}
	cout<<sum<<endl;
	return 0;
	}
	 
  • 不定方程求解(给定a,b,c,求ax+by=c,关于未知数x和y的解)
#include<iostream>
using namespace std;
int main(){
int a=2,b=3,c=18;
int count=0;
for(int i=0;i<1000;i++){
	for(int j=0;j<1000;j++){
		if(a*i+b*j==c){
			count++;
			cout<<i<<","<<j<<endl;
		}
	}
}
cout<<count<<endl;
return 0;
} 
  • 扑克牌打乱
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<string>
using namespace std;
typedef struct card
{

	int Suit;					// 花色
	string Number;				// 牌数
} Card;

Card OneCard[52];

void showCard()
{
	string sign;
	for (int i = 0, j = 0; i < 52, j < 52; i++, j++)
	{
		if (!(j % 13))
		{
			cout << endl;
		}
		switch (OneCard[i].Suit)
		{
		case 0:
			sign = "菱形";
			break;
		case 1:
			sign = "红桃";
			break;
		case 2:
			sign = "梅花";
			break;
		case 3:
			sign = "黑桃";
			break;
		default:
			;
		}
		cout<<sign<<OneCard[i].Number<<" ";
	}
	cout << endl;
}

void Shuffle()
{
	int i, j, temp;
	int suit;
	Card tempcard;
	suit = -1;
	for (i = 0; i < 52; i++)
	{
		if (i % 13 == 0)
		{
			++suit;
		}
		OneCard[i].Suit = suit;
		temp = i % 13;
		switch (temp)
		{
		case 0:
			OneCard[i].Number = 'A';
			break;
		case 9:
			OneCard[i].Number = "10";
			break;
		case 10:
			OneCard[i].Number = 'J';
			break;
		case 11:
			OneCard[i].Number = 'Q';
			break;
		case 12:
			OneCard[i].Number = 'K';
			break;
		default:
			OneCard[i].Number = temp + '1';
			break;
		}
	}
	cout << "新牌的初始排列如下:" << endl;
	showCard();
	srand(time(NULL));
	for (i = 0; i < 52; i++)
	{

		j = rand() % 52;
		tempcard = OneCard[j];
		OneCard[j] = OneCard[i];
		OneCard[i] = tempcard;
	}
}

int main()
{
	Shuffle();
	cout<<"\n该牌洗后的排列如下:"<<endl;
	showCard();
	for(int j=0;j<52;j++)
	{
	if (!(j % 13))
		{
			cout << endl;
		}
	cout<<OneCard[j].Suit<<"   ";
	}
	return 0;
	
	
	}
发布了21 篇原创文章 · 获赞 14 · 访问量 4103

猜你喜欢

转载自blog.csdn.net/Cxk___/article/details/103275652