Project Euler 80

Square root digital expansion

Problem 80

It is well known that if the square root of a natural number is not an integer, then it is irrational. The decimal expansion of such square roots is infinite without any repeating pattern at all.

The square root of two is 1.41421356237309504880..., and the digital sum of the first one hundred decimal digits is 475.

For the first one hundred natural numbers, find the total of the digital sums of the first one hundred decimal digits for all the irrational square roots.

    简单来说,这题是要我们高精度开方。利用C自带的sqrt库函数肯定是搞笑的,题目要求我们求到根号小数点后100位,double不能达到精度要求。(印象中double的精确值可能只到小数点6、 7位?)

    像我们处理大数加法和乘法那样的,同样用数组来表示一个精度足够高的小数,再进行开方的估计,是这题的基本思路。

一、二分逼近

    √n的值总是在0~n之间,基于此,而y=√x恰恰是单调函数,于是我们可以用n/2作为初始值,平方一下,比较其与n的大小,如果太大,就让新的估计值t=(n/2+0)/2,如果太小,就让t=(n/2+n)/2,以此类推,直到精度符合要求。

    坏处是写小数的高精度加法有点不好写,可以考虑拆分成整数部分和小数部分。或者固定小数点(比如令a[100]为整数部分的个位),在所有的小数末位添0。

二、牛顿法

    一个相关的数学定理是:如果g是√n的一个估计值,那么(g+n/g)/2是g的一个更好的估计值。

    基于此,可以通过不断迭代来达到精度。

    坏处跟上面一样,而且不好估计自己是否达到了精度。

三、手算法

    这个方法我也不知道叫什么名字了。。。但思路来源是一个曾经看过的一个叫《如何手算开平方》的文章。

    找了篇类似的,链接:https://jingyan.baidu.com/article/4f7d5712f663371a20192797.html

    原理什么的百度也有,这也不是数学技术贴,实在是介绍不来。

    好处是一次操作我们就可以得到一位的精确值,可以知道什么时候结束,而且写起了也比较简单,只用写个高精度乘法就可以。代码贴下:

#include <stdio.h>
#include <math.h>
#include <string.h>

void tianling(int yu[]);
void found(int yu[],int ans[]);          
void xiangcheng(int a[],int b,int ans[]);   // a * b = ans
int comp(int a[],int b[]);   //  a<b  1   a>b  0
void xiangjian(int a[],int b[],int ans[]); //  a - b = ans

int main() {
	int ans[200]={0},yu[200]={0},j=2,sum=0;
	for (int i=2;i<100;i++) {
		memset(ans,0,200*sizeof(int));
		memset(yu,0,200*sizeof(int));
		if (i==j*j) {
			j++;
			continue;
		}
		ans[0]=(int)sqrt(i);
		yu[0]=i-ans[0]*ans[0];
		if (yu[0]>9) {
			yu[1]=yu[0]/10;
			yu[0]%=10;
		}
		for (int k=1;k<=100;k++) {
			tianling(yu);
			found(yu,ans);
		}
//		if (1)  {
//			printf("%d\n",i);
//			for (int j=100;j>=0;j--) {
//				printf("%d",ans[j]);
//			}
//			printf("\n");
//		}   //for test
		for (int i=1;i<=100;i++) {
			sum+=ans[i];
		}
		if (i==2) printf("%d",sum);
	}
	printf("%d",sum);
}

int comp(int a[],int b[]) {
	int taila=200,tailb=200,max;
	while (a[--taila]==0);
	while (b[--tailb]==0);
	max=taila>tailb?taila:tailb;
	for (int i=max;i>=0;i--) {
		if (a[i]>b[i]) return 0;
		if (a[i]<b[i]) return 1;
	}
}

void xiangjian(int a[],int b[],int ans[]) {
	int taila=200,tailb=200,max;
	memset(ans,0,120*sizeof(int));
	while (a[--taila]==0);
	while (b[--tailb]==0);
	max=taila>tailb?taila:tailb;
	for (int i=0;i<=taila;i++) {
		ans[i]+=a[i]-b[i];
		if (ans[i]<0) {
			ans[i]+=10;
			ans[i+1]--;
		}
	}
}

void tianling(int yu[]) {
	int i=199;
	while (i>=0) {
		if (yu[i]!=0) break;
		i--;
	}
	for (int j=i;j>=0;j--) {
		yu[j+2]=yu[j];
	}
	yu[0]=yu[1]=0;
}

void xiangcheng(int a[],int b,int ans[]) {
	memset(ans,0,200*sizeof(int));
	for (int i=0;i<200;i++) {
		ans[i]=a[i]*b;
	}
	for (int i=0;i<200;i++)  {
		if (ans[i]>9) {
			if (i==199) {
				printf("overflow");
				break;
			}
			ans[i+1]+=ans[i]/10;
			ans[i]%=10;
			
		}
	}
}

void found(int yu[],int ans[]) {
	int temp[200]={0},newyu[200]={0},newans[200]={0},k;
	xiangcheng(ans,20,newans);
	for (k=9;k>=0;k--) {
		newans[0] = k;
		memset(temp,0,200*sizeof(int));
		xiangcheng(newans,k,temp);
		if (comp(yu,temp)==0) {
			break;
		}
	}
	xiangjian(yu,temp,newyu);
	for (int i=0;i<200;i++) {
		yu[i] = newyu[i];
	}
	xiangcheng(ans,10,newans);
	newans[0] = k;
	for (int i=0;i<200;i++) {
		ans[i] = newans[i];
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是在openeuler上安装OpenStack的步骤: 1. 确保你的openeuler系统已经安装了必要的软件包和依赖项。可以使用以下命令安装: ```shell sudo dnf install -y python3-devel libffi-devel gcc openssl-devel ``` 2. 添加OpenStack Train软件源。可以使用以下命令添加: ```shell sudo dnf install -y centos-release-openstack-train ``` 3. 安装OpenStack客户端和服务组件。可以使用以下命令安装: ```shell sudo dnf install -y python3-openstackclient openstack-selinux openstack-utils ``` 4. 配置数据库。可以使用以下命令安装MariaDB数据库: ```shell sudo dnf install -y mariadb mariadb-server python3-PyMySQL ``` 然后启动MariaDB服务并设置开机自启: ```shell sudo systemctl enable mariadb.service sudo systemctl start mariadb.service ``` 接下来,使用以下命令来配置MariaDB数据库: ```shell sudo mysql_secure_installation ``` 5. 配置消息队列。可以使用以下命令安装RabbitMQ消息队列: ```shell sudo dnf install -y rabbitmq-server ``` 然后启动RabbitMQ服务并设置开机自启: ```shell sudo systemctl enable rabbitmq-server.service sudo systemctl start rabbitmq-server.service ``` 6. 配置身份认证服务。可以使用以下命令安装Keystone身份认证服务: ```shell sudo dnf install -y openstack-keystone httpd mod_wsgi ``` 然后启动httpd服务并设置开机自启: ```shell sudo systemctl enable httpd.service sudo systemctl start httpd.service ``` 7. 配置计算服务。可以使用以下命令安装Nova计算服务: ```shell sudo dnf install -y openstack-nova-api openstack-nova-conductor \ openstack-nova-console openstack-nova-novncproxy \ openstack-nova-scheduler python3-novaclient ``` 8. 配置网络服务。可以使用以下命令安装Neutron网络服务: ```shell sudo dnf install -y openstack-neutron openstack-neutron-ml2 \ openstack-neutron-linuxbridge ebtables ipset ``` 9. 配置镜像服务。可以使用以下命令安装Glance镜像服务: ```shell sudo dnf install -y openstack-glance ``` 10. 配置块存储服务。可以使用以下命令安装Cinder块存储服务: ```shell sudo dnf install -y openstack-cinder targetcli python-keystone ``` 11. 配置对象存储服务。可以使用以下命令安装Swift对象存储服务: ```shell sudo dnf install -y openstack-swift-proxy python3-swiftclient \ python3-keystoneclient python3-keystonemiddleware \ python3-eventlet xfsprogs rsync ``` 12. 配置Dashboard服务。可以使用以下命令安装Horizon Dashboard服务: ```shell sudo dnf install -y openstack-dashboard ``` 13. 配置OpenStack服务。可以使用以下命令配置OpenStack服务: ```shell sudo openstack-config --set /etc/nova/nova.conf database connection mysql+pymysql://nova:password@controller/nova sudo openstack-config --set /etc/nova/nova.conf DEFAULT transport_url rabbit://openstack:password@controller sudo openstack-config --set /etc/nova/nova.conf api auth_strategy keystone sudo openstack-config --set /etc/nova/nova.conf keystone_authtoken www_authenticate_uri http://controller:5000 sudo openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_url http://controller:5000 sudo openstack-config --set /etc/nova/nova.conf keystone_authtoken memcached_servers controller:11211 sudo openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_type password sudo openstack-config --set /etc/nova/nova.conf keystone_authtoken project_domain_name Default sudo openstack-config --set /etc/nova/nova.conf keystone_authtoken user_domain_name Default sudo openstack-config --set /etc/nova/nova.conf keystone_authtoken project_name service sudo openstack-config --set /etc/nova/nova.conf keystone_authtoken username nova sudo openstack-config --set /etc/nova/nova.conf keystone_authtoken password password sudo openstack-config --set /etc/nova/nova.conf DEFAULT my_ip 10.0.0.11 sudo openstack-config --set /etc/nova/nova.conf DEFAULT use_neutron True sudo openstack-config --set /etc/nova/nova.conf DEFAULT firewall_driver nova.virt.firewall.NoopFirewallDriver sudo openstack-config --set /etc/nova/nova.conf vnc enabled true sudo openstack-config --set /etc/nova/nova.conf vnc server_listen 0.0.0.0 sudo openstack-config --set /etc/nova/nova.conf vnc server_proxyclient_address \$my_ip sudo openstack-config --set /etc/nova/nova.conf vnc novncproxy_base_url http://controller:6080/vnc_auto.html sudo openstack-config --set /etc/nova/nova.conf glance api_servers http://controller:9292 sudo openstack-config --set /etc/nova/nova.conf oslo_concurrency lock_path /var/lib/nova/tmp sudo openstack-config --set /etc/neutron/neutron.conf database connection mysql+pymysql://neutron:password@controller/neutron sudo openstack-config --set /etc/neutron/neutron.conf DEFAULT transport_url rabbit://openstack:password@controller sudo openstack-config --set /etc/neutron/neutron.conf DEFAULT auth_strategy keystone sudo openstack-config --set /etc/neutron/neutron.conf keystone_authtoken www_authenticate_uri http://controller:5000 sudo openstack-config --set /etc/neutron/neutron.conf keystone_authtoken auth_url http://controller:5000 sudo openstack-config --set /etc/neutron/neutron.conf keystone_authtoken memcached_servers controller:11211 sudo openstack-config --set /etc/neutron/neutron.conf keystone_authtoken auth_type password sudo openstack-config --set /etc/neutron/neutron.conf keystone_authtoken project_domain_name Default sudo openstack-config --set /etc/neutron/neutron.conf keystone_authtoken user_domain_name Default sudo openstack-config --set /etc/neutron/neutron.conf keystone_authtoken project_name service sudo openstack-config --set /etc/neutron/neutron.conf keystone_authtoken username neutron sudo openstack-config --set /etc/neutron/neutron.conf keystone_authtoken password password sudo openstack-config --set /etc/neutron/neutron.conf oslo_concurrency lock_path /var/lib/neutron/tmp sudo openstack-config --set /etc/glance/glance-api.conf database connection mysql+pymysql://glance:password@controller/glance sudo openstack-config --set /etc/glance/glance-api.conf keystone_authtoken www_authenticate_uri http://controller:5000 sudo openstack-config --set /etc/glance/glance-api.conf keystone_authtoken auth_url http://controller:5000 sudo openstack-config --set /etc/glance/glance-api.conf keystone_authtoken memcached_servers controller:11211 sudo openstack-config --set /etc/glance/glance-api.conf keystone_authtoken auth_type password sudo openstack-config --set /etc/glance/glance-api.conf keystone_authtoken project_domain_name Default sudo openstack-config --set /etc/glance/glance-api.conf keystone_authtoken user_domain_name Default sudo openstack-config --set /etc/glance/glance-api.conf keystone_authtoken project_name service sudo openstack-config --set /etc/glance/glance-api.conf keystone_authtoken username glance sudo openstack-config --set /etc/glance/glance-api.conf keystone_authtoken password password sudo openstack-config --set /etc/glance/glance-api.conf paste_deploy flavor keystone sudo openstack-config --set /etc/glance/glance-api.conf glance_store stores file,http sudo openstack-config --set /etc/glance/glance-api.conf glance_store default_store file sudo openstack-config --set /etc/glance/glance-api.conf glance_store filesystem_store_datadir /var/lib/glance/images/ sudo openstack-config --set /etc/glance/glance-registry.conf database connection mysql+pymysql://glance:password@controller/glance sudo openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken www_authenticate_uri http://controller:5000 sudo openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken auth_url http://controller:5000 sudo openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken memcached_servers controller:11211 sudo openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken auth_type password sudo openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken project_domain_name Default sudo openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken user_domain_name Default sudo openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken project_name service sudo openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken username glance sudo openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken password password sudo openstack-config --set /etc/glance/glance-registry.conf paste_deploy flavor keystone sudo openstack-config --set /etc/cinder/cinder.conf database connection mysql+pymysql://cinder:password@controller/cinder sudo openstack-config --set /etc/cinder/cinder.conf DEFAULT transport_url rabbit://openstack:password@controller sudo openstack-config --set /etc/cinder/cinder.conf DEFAULT auth_strategy keystone sudo openstack-config --set /etc/cinder/cinder.conf keystone_authtoken www_authenticate_uri http://controller:5000 sudo openstack-config --set /etc/cinder/cinder.conf keystone_authtoken auth_url http://controller:5000 sudo openstack-config --set /etc/cinder/cinder.conf keystone_authtoken memcached_servers controller:11211 sudo openstack-config --set /etc/cinder/cinder.conf keystone_authtoken auth_type password sudo openstack-config --set /etc/cinder/cinder.conf keystone_authtoken project_domain_name Default sudo openstack-config --set /etc/cinder/cinder.conf keystone_authtoken user_domain_name Default sudo openstack-config --set /etc/cinder/cinder.conf keystone_authtoken project_name service sudo openstack-config --set /etc/cinder/cinder.conf keystone_authtoken username cinder sudo openstack-config --set /etc/cinder/cinder.conf keystone_authtoken password password sudo openstack-config --set /etc/cinder/cinder.conf oslo_concurrency lock_path /var/lib/cinder/tmp sudo openstack-config --set /etc/swift/proxy-server.conf DEFAULT bind_port 8080 sudo openstack-config --set /etc/swift/proxy-server.conf DEFAULT user swift sudo openstack-config --set /etc/swift/proxy-server.conf DEFAULT swift_dir /etc/swift sudo openstack-config --set /etc/swift/proxy-server.conf pipeline:main pipeline "catch_errors healthcheck cache authtoken keystoneauth proxy-server" sudo openstack-config --set /etc/swift/proxy-server.conf filter:keystoneauth use "egg:swift#keystoneauth" sudo openstack-config --set /etc/swift/proxy-server.conf filter:keystoneauth operator_roles admin,user sudo openstack-config --set /etc/swift/proxy-server.conf filter:authtoken paste.filter_factory keystonemiddleware.auth_token:filter_factory sudo openstack-config --set /etc/swift/proxy-server.conf filter:authtoken auth_uri http://controller:5000 sudo openstack-config --set /etc/swift/proxy-server.conf filter:authtoken auth_url http://controller:5000 sudo openstack-config --set /etc/swift/proxy-server.conf filter:authtoken memcached_servers controller:11211 sudo openstack-config --set /etc/swift/proxy-server.conf filter:authtoken auth_type password sudo openstack-config --set /etc/swift/proxy-server.conf filter:authtoken project_domain_name Default sudo openstack-config --set /etc/swift/proxy-server.conf filter:authtoken user_domain_name Default sudo openstack-config --set /etc/swift/proxy-server.conf filter:authtoken project_name service sudo openstack-config --set /etc/swift/proxy-server.conf filter:authtoken username swift sudo openstack-config --set /etc/swift/proxy-server.conf filter:authtoken password password sudo openstack-config --set /etc/swift/proxy-server.conf filter:cache use "egg:swift#memcache" sudo openstack-config --set /etc/swift/proxy-server.conf filter:cache memcache_servers controller:11211 sudo openstack-config --set /etc/swift/proxy-server.conf filter:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值