前言:西工大noj刷题记录
代码在CodeBlocks16.01环境下编译通过
11题:
/*
*题目:用二分法求方程在(-10,10)之间的根(保留2位小数)
*/
#include <iostream>
#include <stdio.h>
using namespace std;
int noj_011()
{
double x, left = -10, right = 10;
x = (left + right) / 2;
while ((2*x*x*x-4*x*x+3*x-6) <= -0.01 || (2*x*x*x-4*x*x+3*x-6) >= 0.01)
{
if ((2*x*x*x-4*x*x+3*x-6) <= -0.01)
{
left = x;
x = (left + right) / 2;
}
else
{
right = x;
x = (left + right) / 2;
}
}
printf("%5.2f", x);
return 0;
}
12题:
/*
*题目:计算500~800区间内素数的个数cnt,并按所求素数的值从大到小的顺序,再计算其间隔减,加之和,取第一个素数-第二个素数+第三个素数……的值sum
*/
#include <iostream>
using namespace std;
int noj_012()
{
int cnt = 0, sum = 0, flag = 0;
for (int num = 800; num >= 500; --num, flag = 0)
{
for (int subnum = 2; subnum * subnum <= num; ++subnum)
{
if (num % subnum == 0)
{
flag = 1;
break;
}
}
if (!flag)
{
++cnt;
if (cnt % 2 == 1)
{
sum += num;
}
else
{
sum -= num;
}
}
}
cout << cnt << " " << sum << endl;
return 0;
}
13题:
/*
*题目:利用公式pi=4*(1-1/3+1/5-1/7+1/9……),括号中最后一项的绝对值小于10^(-6),计算pi的值(保留6位小数)
*/
#include <iostream>
#include <stdio.h>
using namespace std;
int noj_013()
{
double pi = 0, item = 1;
int num = 1;
while (1 / item >= 1e-6)
{
if (num % 2 == 1)
{
pi += 1 / item;
}
else
{
pi -= 1 / item;
}
item += 2;
num++;
}
pi = pi * 4;
printf("%5.6f", pi);
return 0;
}
14题:
/*
*题目:某级数的前两项A1=1,A2=1,此后有An=A(n-2)+2A(n-1),求依次对于M=100,1000和10000求出对应的n值,
* 使其满足:Sn<M且S(n+1)>=M,Sn=A1+A2+……+An
*/
#include <iostream>
using namespace std;
int noj_014()
{
for (int M = 100; M <= 10000; M *= 10)
{
int sum1 = 0, sum2 = 0, A_first = 1, A_second = 1, temp, num = 0;
while (!(sum1 < M && sum2 >= M))
{
sum1 += A_first;
sum2 = sum1 + A_second;
temp = A_first;
A_first = A_second;
A_second = 2 * A_second + temp;
num++;
}
cout << num << endl;
}
return 0;
}
15题:
/*
*题目:求一个整数的任意次方的最后三位数
*/
#include <iostream>
using namespace std;
int noj_015()
{
int num, power;
long long prdct = 1;
cout << "请输入整数:";
cin >> num;
cout << "请输入幂次:";
cin >> power;
for (int i = 1; i <= power; ++i)
{
prdct *= num;
}
prdct = prdct % 1000;
cout << prdct;
return 0;
}
16题:
/*
*题目:任何一个自然数n的立方都是n个连续的奇数之和,例如1^3=1,2^3=3+5;3^3=7+9+11,求出输入的自然数对应的连续奇数
*/
#include <iostream>
using namespace std;
int noj_016()
{
int naturalnum, sum = 0, first = 1, temp = 1;
cout << "输入自然数:";
cin >> naturalnum;
while (naturalnum * naturalnum * naturalnum > sum)
{
sum = 0;
if (naturalnum != 1)
{
first = temp + 2;
}
temp = first;
for (int i = 1; i <= naturalnum; ++i)
{
sum += first;
first += 2;
}
}
cout << naturalnum << "*" << naturalnum << "*" << naturalnum << "=" << naturalnum * naturalnum * naturalnum << "=";
for (int i = 1; i < naturalnum; ++i)
{
cout << temp << "+";
temp += 2;
}
cout << temp;
return 0;
}
17题:
/*
*题目:某大学两个乒乓球队比赛,各出3人,甲队为A,B,C,乙队为X,Y,Z,抽签后A说不和X打,C说不和X,Z打,编写程序找出对手名单
*/
#include <iostream>
using namespace std;
int noj_017()
{
char A, B, C;
for (A = 'X'; A <= 'Z'; ++A)
{
if (A != 'X')
{
for (C = 'X'; C <= 'Z'; ++C)
{
if (C != 'X' && C != 'Z' && C != A)
{
for (B = 'X'; B <= 'Z'; ++B)
{
if (B != A && B != C)
{
cout << "A" << "=" << A << endl;
cout << "B" << "=" << B << endl;
cout << "C" << "=" << C << endl;
}
}
}
}
}
}
return 0;
}
18题:
/*
*题目:输入两个整数,求两个整数之间所有的素数,两个整数的大小顺序是任意的
*/
#include <iostream>
#include <math.h>
using namespace std;
int noj_018()
{
int first_num, second_num, bgn, nd, flag = 0;
cout << "请输入两个整数:";
cin >> first_num >> second_num;
bgn = (first_num >= second_num? second_num: first_num);
nd = (first_num >= second_num? first_num: second_num);
for (int i = bgn; i <= nd; ++i)
{
flag = 0;
for (int j = 2; j <= sqrt(nd); ++j)
{
if (i % j == 0)
{
flag = 1;
break;
}
}
if (flag == 0)
{
cout << i << " ";
}
}
return 0;
}
19题:
/*
*题目:有一个分数数列:2/1,3/2,5/3,8/5,13/8,21/13,……求出这个数列的前20项之和(保留6位小数)
*/
#include <iostream>
#include <stdio.h>
using namespace std;
int noj_019()
{
double denominator = 1, member = 2, temp;
double sum = 0;
for (int i = 1; i <= 20; ++i)
{
sum += member / denominator;
temp = denominator;
denominator = member;
member = temp + denominator;
}
printf("%5.6f", sum);
return 0;
}
20题:
/*
*题目:输入一个数,输出其整数部分的位数
*/
#include <iostream>
using namespace std;
int noj_020()
{
double num;
int digit = 0;
cout << "请输入数,正负都行:";
cin >> num;
if (num < 0)
{
num = 0 - num;
}
if (num < 1)
{
cout << "0";
return 0;
}
while (num >= 1)
{
num /= 10;
digit++;
}
cout << digit;
return 0;
}