数组
数组排位
已知素数序列为2、3、5、7、11、13、17、19、23、29……,即素数的第一个是2,第二个是3,第三个是5……那么,随便挑一个数,若是素数,能确定是第几个素数吗?如果不是素数,则输出0。
输入格式:
测试数据有多组,处理到文件尾。每组测试输入一正整数N(1≤N≤1000000)。
输出格式:
对于每组测试,输出占一行,如果输入的正整数是素数,则输出其排位,否则输出0。
输入样例:
代码语言:javascript复制2
6
4
5
13
991703
输出样例:
代码语言:javascript复制1
0
0
3
6
77901
C/CPP
代码语言:javascript复制#include <iostream>
#include <cmath>
using namespace std;
const int N = 1000000 10;
int a[N];
bool prime(int x)//判断素数
{
if (x == 1)return false;
for (int i = 2; i <= sqrt(x); i )
{
if (x % i == 0)return false;
}
return true;
}
void panDuan(int n)
{
int i = 0;
for (int i = 1; i <= n; i )
{
if (prime(n))i ;
}
cout << i << endl;
}
int main()
{
int a;
while (scanf_s("%d",&a) != EOF)
{
panDuan(a);
}
system("pause");
return 0;
}
代码语言:javascript复制#include <iostream>
#include <cmath>
using namespace std;
const int N = 1000000 10;
int a[N];
void init(int n)//初始化
{
for(int i = 1;i <= n;i )a[i]=i;
}
bool prime(int x)//判断素数
{
if(x==1)return false;
for(int i = 2;i <= sqrt(x);i )
{
if(x%i==0)return false;
}
return true;
}
int main()
{
int n;
while(cin>>n)
{
if(!prime(n))
{
cout<<"0"<<endl;
continue;
}
init(n);
a[1]=0;//排除1
for(int i = 2;i <= sqrt(n);i )
{
for(int j = 1;j <= n;j )
{
if(j%i==0)a[j]=0;
if(prime(i))a[i]=i;//若i为素数则不做处理,防止漏数据
}
}
int idx=0;//素数位数计数
for(int i = 2;i <= n;i )
{
if(a[i]>0)
{
idx ;
if(a[i]==n)break;
}
}
cout<<idx<<endl;
}
}
代码语言:javascript复制#include <iostream>
using namespace std;
const int N = 1000000;
int main()
{
int index[N] = {1}; int cnt = 1;
for (int i = 0; i < N; i )
{
index[i] = 1;
}
index[0] = 0;index[1] = 0;
for (int i = 2; i <=N; i )
{
if (index[i] == 0)continue;
index[i] = cnt;
cnt = 1;
for (int j = i * i; j <=N; j = i)
{
index[j] = 0;
}
}
int a;
while (scanf("%d", &a) != EOF) {
cout << index[a] << endl;
}
return 0;
}
素数优化:
代码语言:javascript复制#include <iostream>
#include <math.h>
using namespace std;
//素数优化!详见素数优化文章
bool prime(int m) {
int i = 0;
if (m>= 0 && m <= 8)
{
if(m==2 || m==3 || m==5 || m==7)return 1;
else return 0;
}
for (i = 3; i <= sqrt(m); i = 2)
if (m % i == 0) return 0;
if (i >= sqrt(m)) return 1;
else return 0;
}
int get_prime(int N){
int n =1;
for (int i =3 ; i <= N; i =2){
if (prime(i)){
n ;
}
}
return n;
}
int main(){
int a;
while (scanf("%d",&a) != EOF){
prime(a)?cout<<get_prime(a)<<endl:cout<<0<<endl;
}
return 0;
}
Python
代码语言:javascript复制N = 1000000
index = [1]*(N 1)
def f():
index[0] = index[1] = 0
cnt = 1
for i in range(2,N 1):
if index[i] == 0:
continue
index[i] = cnt
cnt = 1
for j in range(i * i,N 1,i):
index[j]=0
f()
try:
while True:
n = int(input())
print(index[n])
except EOFError:pass
计算字符串数组长度
从键盘任意输入一个字符串,用数组的方式计算其实际字符个数并打印出来,即不使用字符串处理函数strlen()编程实现strlen的功能。
函数接口:
代码语言:javascript复制unsigned int MyStrlen(const char str[])
输入格式:
字符串
输出格式:
字符串长度
输入样例:
在这里给出一组输入。例如:
代码语言:javascript复制hello world
输出样例:
在这里给出相应的输出。例如:
代码语言:javascript复制11
CCPP
解法一:
代码语言:javascript复制#include<stdio.h>
#include<iostream>
using namespace std;
unsigned int MyStrlen()
{
int i = 0;
while ((getchar() != 'n'))
{
i ;
}
return i;
}
int main()
{
cout << MyStrlen() << endl;
system("pause");
return 0;
}
输入:hello world
输出:11
解法二:
问题分析:
代码语言:javascript复制#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
unsigned int MyStrlen(const char str[])
{
return sizeof(str)/sizeof(char);//注意此时的str是一个指针!
}
int main()
{
char arr[500]={0};
fgets(arr,500,stdin);
cout<<strlen(arr)<<endl;
return 0;
}
输入:hello world
输出:8
问题分析:因为使用了函数进行运算,数组退化为指针,所以在MyStrlen()
中sizeof
计算的实际上是指针的长度,结果出错!
注意易混点:sizeof(arr) / sizeof(char)
计算的是数组的长度,而不是数组中字符串的长度!!
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int main()
{
char arr[500] = { 0 };
fgets(arr, 500, stdin);
cout << sizeof(arr) / sizeof(char) << endl;
system("pause");
return 0;
}
输入:hello world
输出:500
解法三:
代码语言:javascript复制#include<stdio.h>
int main(void)
{
char s[100];
int count = 0;
gets(s);
for (int i = 0; s[i] != '