来自Project Euler,问题45:
三角形,五边形和六边形数字由以下公式生成:
三角形T_(n)= n(n + 1)/ 2 1,3,6,10,15 ......
五角形P_(n)= n(3n-1)/ 2 1,5,12,22,35 ......
六角形H_(n)= n(2n-1)1,6,15,28,45,......
可以证实T_(285)= P_(165)= H_(143)= 40755.
找到下一个三角形和六边形的三角形数字.
这是问题所在.它非常简单明了,但问题是,当三角形数值超过int数据类型中的最大值时,我的程序会遇到一个小故障.我尝试过为其他数据类型搜索网络但没有成功.
码
#include<stdio.h>
int main(void)
{
int i,j,t,h,p,k;
int n=10000;
for(i=0;i<n;i++)
{
t=(i*(i+1))/2;
for(j=0;j<n;j++)
{
h=j*(2*j-1);
if(h>t)
break;
if(h==t)
{
//printf("%d %d\n",h,t);
for(k=0;k<n;k++)
{
p=(k*(3*k-1))/2;
if(p>h)
break;
if(p==h)
{
printf("%d %d\n",p,i);
break;
}
}
}
}
}
printf("done\n");
return(0);
}
Run Code Online (Sandbox Code Playgroud) 这是问题陈述:
3797号有一个有趣的地方.作为素数本身,可以从左到右连续删除数字,并在每个阶段保持素数:3797,797,97和7.同样,我们可以从右到左工作:3797,379,37和3.
找到从左到右和从右到左都可截断的仅有的11个素数之和.
注意:2,3,5和7不被认为是可截断的素数.
我的代码给了我一个部分输出.只输出了11个所需素数中的5个或6个,其中3797个不是其中之一.所以为了找到错误,我手动(在一张纸上)运行3797的代码,并以某种方式无法找到故障.
我认为错误在第二部分,代码的一部分,检查数字是否可以从左侧截断.
码:
#include<stdio.h>
int isprime(int n) //Checks whether the number is prime or not
{
int i;
if(n==1)
return(0);
for(i=2;i<n/2+1;i++)
{
if(n%i==0)
{
return(0);
break;
}
}
return(1);
}
int main(void)
{
int count=0,z=0;
int i;
int n;
int x=1;
int reverse2=0;
int z1=0;
int p;
int count1=0;
int digit;
int k=1000000;
int reverse=0;
for(i=2;i<k;i++)
{
if(isprime(i)==1)
{
n=i;
p=i;
while(n>0) // This function removes the digits of the prime number from the right
{ …Run Code Online (Sandbox Code Playgroud) 我开始编程大约6个月,并且对如何用C编码有很好的知识.我主要用它来实现基本算法或解决Project Euler问题(现在达到50个:) :)我很久以来想要学习的东西是游戏编程.即制作简单的2D游戏,如蛇或口袋坦克.简单来说,我绝不意味着制作这些游戏需要花费大量的工作或精力
我试过在网上搜索,但没有运气.有人能指出我正确的方向吗?
我到底需要学习什么?我从哪里开始?
我在解读关于欧拉项目的问题的同时读了Eratosthenes的筛子.我相信你们都知道我在谈论哪个问题.所以这就是事情.我的代码设法正确显示100万以下的所有素数.然而,当我尝试200万相同的实现它给我一个分段错误...我已经知道为什么错误即将到来但不知道如何纠正它...这里是100万以下的素数的代码.
#include<stdio.h>
int main(void)
{
int i,k=2;
int j;
int n=1000000;
int prime[2000000]={};
for(i=0;i<n;i++) // initializes the prime number array
{
prime[i]=i;
}
for(i=2;i<n;i++) // Implementation of the Sieve
{
if(prime[i]!=0)
{
for(j=2;j<n;j++)
{
{
prime[j*prime[i]]=0;
if(prime[i]*j>n)
break;
}
}
}
}
for(i=0;i<n;i++) // Prints the prime numbers
if(prime[i]!=0)
{
printf("%d\n"prime[i]);
}
return(0);
}
}
Run Code Online (Sandbox Code Playgroud) 好的,这是我的表模式。
我有2张桌子。说表A和表B。表A的主键是PriKeyA bigint(50),表B的主键是PriKeyB varchar(255)。PriKeyA 和 PriKeyB 都包含相同类型的数据。
这个问题需要的表A的相关字段是Last_login_date_in_A(日期),表B是主键本身。
我需要做的是,在 A 中获取那些在表 B 的 PriKeyB 列中不存在的 PriKeyA,并且 Last_login_date_in_A 列应该从当前日期起超过 30 天。基本上我需要表 A 和表 B 的差异以及某个条件(这是这个问题中的日期)
这是我的 SQL 命令
: SELECT A.PriKeyA from A
LEFT JOIN B ON A.PriKeyA = B.PriKeyB
WHERE B.PriKeyB IS NULL and DATEDIFF(CURRENTDATE,Last_login_date_in_A)>30;
Run Code Online (Sandbox Code Playgroud)
但是,当我运行这个 MySQL 命令时,它需要花费很长的时间(大约 3 小时)。表 A 的大小为 2,50,000,表 B 的大小分别为 42,000 条记录。我认为这个问题可能是因为 PriKeyA 和 PriKeyB 是不同的数据类型。所以我也在CAST(PriKeyB as unsigned)查询中使用了。但这也不起作用。性能略有提高。
可能的问题是什么?我以前使用过左连接,他们从来没有用过这么长时间。
好的,所以我正在尝试解决背包问题.
在小输入情况下,程序运行没有问题并提供最佳解决方案,但是当输入大小很大,或者输入文件中的数字变大时,程序会给我一个分段错误.我不明白为什么会发生这种情况,因为INT的最大值也超过了这些数字中的任何一个.
这是我的代码.
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int W,n,i,j,k ;
scanf("%d %d",&W,&n); // capacity of knapsack and number of total items
int value[n+1],weight[n+1];
int** A;
A = (int **)malloc((n+1)*sizeof(int*));
for(i=0;i<W+1;i++)
A[i]=(int *)malloc(sizeof(int)*(W+1));
for(i=1;i<n+1;i++)
{
scanf("%d %d",&value[i],&weight[i]); //taking value and weight of each item
}
for(i=0;i<W+1;i++)
A[0][i]=0;
for(i=0;i<n+1;i++)
A[i][0]=0;
for(i=1;i<n+1;i++)
{
for(j=1;j<W+1;j++)
{
if(j-weight[i]<0)
{
A[1][j]=A[0][j];
}
else
{
if(A[0][j]>A[0][j-weight[i]]+value[i])
A[1][j]=A[0][j];
else
A[1][j]=A[0][j-weight[i]]+value[i];
}
}
for(k=0;k<W+1;k++)
A[0][k]=A[1][k];
}
int max=0;
i=1;
for(i=0;i<2;i++)
for(j=0;j<W+1;j++)
{
if(A[i][j]>max)
max=A[i][j];
}
printf("%d\n",max);
return(0);
} …Run Code Online (Sandbox Code Playgroud) 当我随意地将参数传递给区域函数时,代码运行完美.但是当我尝试运行循环时,给我一个分段错误.给定n <100
这是我的代码.
#include<stdio.h>
#include<math.h>
double area(int x,int y,int x1,int y1,int x2,int y2)
{ //Heron's formula
double a,b,c,s;
double abc;
a=sqrt(((x-x1)*(x-x1))+((y-y1)*(y-y1)));
b=sqrt(((x-x2)*(x-x2))+((y-y2)*(y-y2)));
c=sqrt(((x2-x1)*(x2-x1))+((y2-y1)*(y2-y1)));
s=(a+b+c)/2;
abc=sqrt(s*(s-a)*(s-b)*(s-c));
return(abc);
}
int main(void)
{
int n,i,j,k;
double max=0,z=0;
scanf("%d",&n);
int x[100]={},y[100]={};
for(i=0;i<n;i++)
{
scanf("%d %d",&x[i],&y[i]);
}
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
for(k=j+1;k<n;j++)
{
z=area(x[i],y[i],x[j],y[j],x[k],y[k]);
printf("%lf\n",z);
if(z>max)
{
max=z;
}
}
}
}
//printf("\n%lfoi\n",area(0,0,1,0,1,2));
printf("%lf",max*2);
}
Run Code Online (Sandbox Code Playgroud)