一些数学运算-c++代码实现
心情挺抑郁的,不过都是些基础题,有时间再解释吧。
1.勾股数:求N(由用户输入的整数)以内,满足勾股定理的所有整数解,并每三个一行输出, 即满足 a2+b2=c^2(a,b,c均小于等于N)
#include <bits/stdc++.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(){
unsigned long n, a, b ,c, i=0;
scanf("%lu", &n); //输入N;
for(a=1; a<=n; a++){
for(b=a; b<=n; b++){
for(c=b; c<=n; c++){
if(c*c == a*a + b*b){// 暴力循环求解;
i++;
printf("%lu*%lu + %lu*%lu = %lu*%lu", a,a,b,b,c,c);//打印输出结果;
printf("\n");
}
}
}
}
printf("%lu组", i);
return 0;
}
2.完全数,古希腊人认为因子的和等于它本身的数是一个完全数(自身因子除外),例如28的因子是1、2、4、7、14,且1+2+4+7+14=28,则28是一个完全数,编写一个程序求2-1000内的所有完全数。
#include <bits/stdc++.h>
using namespace std;
int m=2;
int n=1000;
//声明一个返回布尔类型的函数
bool perfect_num(int x);
int shuchu(int x);
int main() {
int x;
for (x = m; x <= n; ++x) {
//使用函数,检查当前x是否符合条件
if (perfect_num(x)) {
cout << x << "=";
shuchu(x);
printf("\n");
}
}
return 0;
}
bool perfect_num(int x) {
//初始化flag
bool flag = false;
//初始化所有因子之和
int sum = 0, i;
//遍历从1到x的所有整数
for (i = 1; i < x; ++i) {
//判断是否为因子
if (x % i == 0) {
sum += i;
}
}
//更新flag
flag = (sum == x);
return flag;
}
int shuchu(int x){
int b;
int i=0;
int a[1000]={0};
b=x-1;
while(b>0){
if(x%b==0){
a[i++]=b;
}
b--;
}
for(int j=0;j<i;j++){
printf("+%d",a[j]);
}
}
3. 平面分割问题。问题的提出:设有n条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何三条封闭曲线不相交于同一点。问当输入曲线数目为n时候,这些封闭曲线把平面分割成的区域个数。
//封闭曲线平面分割问题
#include <bits/stdc++.h>
using namespace std;
int a[]={0};
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int ditui(int n){//递推函数
if(n==1){
a[n]=2;
}
if(n>1){
a[n]=ditui(n-1)+2*n-2;
}
return a[n];
}
int main(int argc, char** argv) {
int m,i;
cin>>i;
m=ditui(i);
printf("%d",m);
return 0;
}
4. 最优路径问题。如下所示为一个数字三角形。请编一个程序计算从顶到底的某处的一条路径,使该路径所经过的数字总和最大。只要求输出总和。
#include <bits/stdc++.h>
#define M 500
using namespace std;
int main() {
int n;
int a[M][M];
int temp=0;
cout<<"三角形边长为:";
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++){
cin>>a[i][j];
}
}
for(int i=n-2;i>=0;i--){
for(int j=0;j<=i;j++){
if(a[i+1][j] < a[i+1][j+1]){
a[i][j]+=a[i+1][j+1];
}
else{
a[i][j]+=a[i+1][j];
}
}
}
cout<<"最优路径是:"<<a[0][0];
return 0;
}
6. 递归求解全排列问题。全排列算法是一种经典的递归算法。例如集合{a,b,c}的全排列为{(a,b,c)、(a,c,b)、(b,a,c)、(b,c,a)、(c,b,a)、(c,a,b)}共3!种。
//递归算法求全排列
#include<bits/stdc++.h>
using namespace std;
#define MAX 100
void swap(int &a,int &b)//交换函数
{
int temp;
temp=a;
a=b;
b=temp;
}
void perm(char* list,int k,int m)//递归排列
{
if(k==m)
{
for(int i=0;i<=m;i++)
cout<<list[i];
cout<<endl;
}
else
for(int i=k;i<=m;i++)
{
swap(list[k],list[i]);
perm(list,k+1,m);
swap(list[k],list[i]);
}
}
int main()
{
int n;
char list[MAX];
cin>>n;
for(int i=0;i<n;i++)
cin>>list[i];
perm(list,0,n-1);
return 0;
}
为什么发信息给喜欢的女生都不回呢?