简单数学
A1049
#include<cstdio>
using namespace std;
int main(){
int n;
scanf("%d",&n);
//看n的每一位
int a = 1,ans=0,left,now,right;
while(n>=a){
left = n/(a*10);//左边的位上有多少变化
right = n % a;
now = n/a%10;
// printf("%d %d %d\n",left,right,now);
if(now==0){
//左边 0 ~ left-1 右边 0 ~ a-1
ans += left*a;
}else if(now==1){
//1.左边 0 ~ left-1 右边 0 ~ a-1
//2.左边 left 右边 0 ~ right
ans += left*a+right+1;
}else{
//左边 0 ~ left
//右边 0 ~ a-1
ans += (left+1)*a;
}
a*=10;
}
printf("%d",ans);
}
A1104
思路不难但是测试样例的数据好像比较那啥。double加多了误差会变大。
柳神代码
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
long long sum = 0;
double temp;
for (int i = 1; i <= n; i++) {
cin >> temp;
sum += (long long)(temp * 1000) * i * (n - i + 1);
}
printf("%.2f", sum / 1000.0);
return 0;
}
A1105
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
int isPrime(int r){
int k = 0;
for(int i=2;i<=sqrt(r);i++){
if(r%i==0)
k = i;
}
return k;
}
vector<int> v;
int main(){
int N;
scanf("%d",&N);
for(int i=0,m;i<N;i++){
scanf("%d",&m);
v.push_back(m);
}
sort(v.rbegin(),v.rend());
int k = isPrime(N);
if(k==0){
for(int i=0;i<v.size();i++){
printf("%d\n",v[i]);
}
}else{
int n = k;
int m = N/k;
int a[m+1][n+1] = {
0};
int i=1,j=1,num=0;
while(i<=m&&j<=n&&num<N){
while(j<=n&&a[i][j]==0){
a[i][j++] = v[num++];
}
j--;i++;
while(i<=m&&a[i][j]==0){
a[i++][j] = v[num++];
}
i--;j--;
while(j>=1&&a[i][j]==0){
a[i][j--] = v[num++];
}
j++;i--;
while(i>=1&&a[i][j]==0){
a[i--][j] = v[num++];
}
i++;j++;
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(j!=1)
printf(" ");
printf("%d",a[i][j]);
}
printf("\n");
}
}
}
分数的四则运算
通用模板
#include<cstdio>
#include<algorithm>
using namespace std;
struct Fraction{
ll up,down;
};
Fraction reduction(Fraction result){
if(result.up<0){
result.up*=-1;
result.down*=-1
}
if(result.up==0){
result.down=1;
}else{
ll d = gcd(abs(result.up),abs(result.down));
result.up /= d;
result.down /= d;
}
return result;
}
Fraction add(Fraction f1,Fraction f2){
Fraction result;
result.up = f1.down*f2.up+f1.up*f2.down;
result.down = f1.down*f2.down;
return reduction(result);
}
Fraction minu(Fraction f1,Fraction f2){
Fraction result;
result.up = f1.up*f2.down-f1.down*f2.up;
result.down = f1.down*f2.down;
return reduction(result);
}
Fraction multi(Fraction f1,Fraction f2){
Fraction result;
result.up = f1.up*f2.up;
result.down = f1.down*f2.down;
return reduction(result);
}
Fraction divide(Fraction f1,Fraction f2){
Fraction result;
result.up = f1.up*f2.down;
result.down = f1.down*f2.up;
return reduction(result);
}
void showResult(Fraction r){
if(r.down==1)printf("%lld",r.up);
else if(abs(r.up)>r.down){
printf("%lld %lld/%lld",r.up/r.down,abs(r.up)%r.down,r.down);
}else{
printf("%lld/%lld",r.up,r.down);
}
}
int main(){
}
A1081
关键:
long long 类型的取模运算% 需要algorithm头文件支持
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
struct Fraction{
ll up,down;
};
ll gcd(ll x,ll y){
return y==0?x:gcd(y,x%y);
}
Fraction reduction(Fraction result){
if(result.down<0){
result.down*=-1;
result.up*=-1;
}
if(result.up==0)
result.down = 1;
else{
ll d = gcd(abs(result.up),abs(result.down));
result.up /= d;
result.down /= d;
}
return result;
}
Fraction add(Fraction a,Fraction b){
Fraction result;
result.up = a.up*b.down+b.up*a.down;